sailsjs策略导致在发送错误后无法设置标头

时间:2015-02-15 17:28:32

标签: node.js sails.js policy

我有这个策略,它基本上检查用户对某个对象的访问权限,然后才允许他们对它做任何事情。那么,用户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。并不是说它会有所作为,但我必须考虑到我在那里做错了。

任何人都明白为什么会给我这个错误?

1 个答案:

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

        });
};