0

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

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,然后停止并关闭连接而不会出错。

4

2 回答 2

1

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

问题是在这部分代码中没有办法获取 Meteor.user() 。

但是您始终可以访问 Meteor.userId .. 如果用户已登录,则它不为空 .. 因此您只能为已登录的用户上传。(如果 req.headers['x-userid'] == Meteor.userId)

调用 Meteor.users.findOne({_id:userId}); 的行为本身 以某种方式破坏了上传流。

因为它是反应部分......所以每次如果 Meteor.users 集合被更新,这部分代码就会再次执行。

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

于 2013-04-19T07:56:02.637 回答
1

我已经遇到过很多次了,这很令人沮丧。我认为您不能Meteor.userId()从光纤内部拨打电话。我通常var userId = Meteor.userId();在调用光纤之前做一个,然后引用该变量。

于 2013-08-29T17:54:52.747 回答