根据这个答案,我创建了自己的路线,以便我可以处理文件上传。这是我所拥有的:
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,然后停止并关闭连接而不会出错。