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集合已更新”--为什么抓取会导致更新?