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();

        });
};