Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 如何在自定义路由中获取当前用户?_Meteor - Fatal编程技术网

Meteor 如何在自定义路由中获取当前用户?

Meteor 如何在自定义路由中获取当前用户?,meteor,Meteor,根据,我创建了自己的路由,以便处理文件上传。以下是我得到的: var router = Connect.middleware.router(function(route) { route.post('/upload', function(req, res) { var filename = req.headers['x-filename']; var path = Path.join('.uploads', filename); var w

根据,我创建了自己的路由,以便处理文件上传。以下是我得到的:

var router = Connect.middleware.router(function(route) {
    route.post('/upload', function(req, res) {
        var filename = req.headers['x-filename'];
        var path = Path.join('.uploads', filename);
        var writeStream = FileSystem.createWriteStream(path);
        writeStream.on('error', function(e) {
            console.error(e);
            res.writeHead(500);
            res.end();
        }).on('close', function() {
            Fiber(function() {
                console.log(Meteor.user());
            }).run();
            res.writeHead(200);
            res.end();
        });
        req.pipe(writeStream);
    });
});
app.use(router);
这非常适合上传文件,但当我尝试访问
Meteor.user()
时,它会给我:

app/server/main.js:24
            }).run();
               ^
Error: Meteor.userId can only be invoked in method calls. Use this.userId in publish functions.
    at Object.Meteor.userId (app/packages/accounts-base/accounts_server.js:95:13)
    at Object.Meteor.user (app/packages/accounts-base/accounts_server.js:100:25)
    at app/server/main.js:23:36
Exited with code: 1
我在
req
对象中看不到任何可能帮助我的东西

有没有办法访问用户对象


目前,我正在获取客户端的用户ID,并通过标头传递它,然后使用标头查找服务器端:

route.post('/upload', function(req, res) {
    Fiber(function() {
        var userId = req.headers['x-userid'];
        var user = Meteor.users.findOne({_id:userId});
        if(user) {
            ...
        } else {
            res.writeHead(403,'User not logged in');
            res.end();
        }
    }).run();
});
我不喜欢这个,因为它一点也不安全。在不同用户的帐户下上传东西会很容易


编辑:不必担心。调用Meteor.users.findOne({u id:userId})的行为以某种方式中断了上载流。每一个文件都会被破坏,只要我把它放进去;他们上传的数据最大可达700 KB,然后停止并关闭连接,不会出错。

如果这仍然是一个有效的问题

问题是无法在这部分代码中获取Meteor.user()

但是你总是可以访问Meteor.userId。。如果用户登录,则不为空。。因此,您只能为已登录的用户上载。(如果请求头['x-userid']==Meteor.userid)

调用Meteor.users.findOne({u id:userId})的行为;以某种方式 中断上载流

因为这是反应性的部分。。因此,每次更新Meteor.users集合时,都会再次执行这部分代码


所以,如果您只能使用Meteor.userId(只有在用户登录/注销时才会更改),它应该可以正常工作。

我已经多次遇到过这个问题,这很令人沮丧。我认为你不能在光纤中进行
Meteor.userId()
调用。我通常做一个
var userId=Meteor.userId()调用光纤之前,然后引用该变量

是的,这个问题仍然有效:-)我认为如果我真的可以访问
Meteor.userId
,这可能适用于这个用例,但我不确定这对以后的任何事情都足够灵活。“如果Meteor.users集合已更新”--为什么抓取会导致更新?