如何让当前用户进入自定义路线?

时间:2013-02-16 20:40:35

标签: meteor

根据this answer我创建了自己的路线,以便我可以处理文件上传。这就是我所拥有的:

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({_id:userId});的行为会以某种方式破坏上传流。一旦我把它放进去,每个文件都会被破坏;他们上传大约700 KB,然后只是停止并关闭连接而没有错误。

2 个答案:

答案 0 :(得分:1)

如果它仍然是有效的问题。

问题是如何在这部分代码中获取Meteor.user()。

但是你可以随时联系Meteor.userId ..如果用户登录就不会为空...所以你只能为已登录的用户上传。 (如果req.headers [' x-userid'] == Meteor.userId)

  

调用Meteor.users.findOne({_ id:userId})的行为;不知何故   打破上传流。

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

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

答案 1 :(得分:1)

我遇到过这么多次,这令人沮丧。我不认为你可以从光纤内部进行Meteor.userId()来电。我通常在调用光纤之前执行var userId = Meteor.userId();,然后引用该变量。