根据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,然后只是停止并关闭连接而没有错误。
答案 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();
,然后引用该变量。