我有这个策略,它基本上检查用户对某个对象的访问权限,然后才允许他们对它做任何事情。那么,用户1是否可以访问事件4以便/ event / edit / 4种事物。
我尝试创建一个策略(我已经编辑过顶部,所以如果这里有错误,请相信我运行返回res.direct的时候应该这样做)但是当它遇到&时#39;正确的条件是风帆过程死亡,错误为"发送后无法设置标题。"
我拿出了另一个被触发的政策,看它是否做了什么,但它并没有改变任何事情。这是我的政策:
module.exports = function(req, res, ok) {
MyObj.find(req.param('id'))
.exec(function getObjects(err, objects){
if (objects[0]["parent"]["user"] != req.session.User.id) {
req.session.flash = {
err: "woops!"
}
return res.redirect('/');
}
});
res.locals.flash = {};
if(!req.session.flash) return ok();
res.locals.flash = _.clone(req.session.flash);
req.session.flash = {};
return next();
};
我还试过返回res.forbidden('您不允许执行此操作。')而不是res.redirect。并不是说它会有所作为,但我必须考虑到我在那里做错了。
任何人都明白为什么会给我这个错误?
答案 0 :(得分:2)
问题是您的查找是异步操作。这意味着,首先,find()将触发,然后中间件函数的其余部分将运行,包括return next()。之后你的find()将返回并触发res.redirect(),从而导致错误。您需要构建代码,以便所有代码都在回调中:
module.exports = function(req, res, ok) {
MyObj.find(req.param('id'))
.exec(function getObjects(err, objects){
if (objects[0]["parent"]["user"] != req.session.User.id) {
req.session.flash = {
err: "woops!"
}
return res.redirect('/');
}
res.locals.flash = {};
if(!req.session.flash) return ok();
res.locals.flash = _.clone(req.session.flash);
req.session.flash = {};
return next();
});
};