sailsjs 策略导致发送错误后无法设置 headers
sailsjs policy causing Can't set headers after they are sent error
我的政策基本上是检查用户对 object 的访问权限,然后再允许他们对其进行任何操作。那么,用户 1 是否可以访问事件 4 以便 /event/edit/4 之类的事情。
我尝试创建一个策略(我已经编辑了顶部,所以如果其中有错误,请相信我,它会按预期运行 return res.direct)但是当它命中了正确的条件,帆进程因 "Can't set headers after they are sent."
错误而死
我取出了另一个被触发的策略,看看它是否在做任何事情,但它并没有改变任何东西。这是我的政策:
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();
};
我也试过 return res.forbidden('You are not permitted to perform this action.') 而不是 res.redirect。并不是说它会有所作为,但我不得不考虑到我在那里做错了事。
有人知道为什么会给我那个错误吗?
问题是您的查找是一个异步操作。这意味着首先,find() 将被触发,然后中间件函数的其余部分将 运行 包括 return next()。之后您的 find() 将 return 并触发 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();
});
};
我的政策基本上是检查用户对 object 的访问权限,然后再允许他们对其进行任何操作。那么,用户 1 是否可以访问事件 4 以便 /event/edit/4 之类的事情。
我尝试创建一个策略(我已经编辑了顶部,所以如果其中有错误,请相信我,它会按预期运行 return res.direct)但是当它命中了正确的条件,帆进程因 "Can't set headers after they are sent."
错误而死我取出了另一个被触发的策略,看看它是否在做任何事情,但它并没有改变任何东西。这是我的政策:
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();
};
我也试过 return res.forbidden('You are not permitted to perform this action.') 而不是 res.redirect。并不是说它会有所作为,但我不得不考虑到我在那里做错了事。
有人知道为什么会给我那个错误吗?
问题是您的查找是一个异步操作。这意味着首先,find() 将被触发,然后中间件函数的其余部分将 运行 包括 return next()。之后您的 find() 将 return 并触发 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();
});
};