【问题标题】:sailsjs policy causing Can't set headers after they are sent errorSailsjs 政策导致发送错误后无法设置标头
【发布时间】:2015-02-15 17:28:32
【问题描述】:

我的这个策略基本上是在允许用户对对象执行任何操作之前检查用户对对象的访问权限。那么,用户 1 是否有权访问事件 4 以进行 /event/edit/4 之类的事情。

我尝试创建一个策略(我已经编辑了顶部,所以如果其中有错误,相信我它会在应该运行的时候运行 return res.direct)但是当它达到正确的条件时,风帆过程死于“发送后无法设置标头”的错误。

我取出另一个被触发的策略来查看它是否在做任何事情,但它没有改变任何东西。这是我的政策:

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 allowed to perform this action.') 而不是 res.redirect。并不是说它会有所作为,但我必须考虑到我在那里做错了事情。

有人知道为什么它会给我这个错误吗?

【问题讨论】:

    标签: node.js sails.js policy


    【解决方案1】:

    问题在于您的查找是异步操作。这意味着首先 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();
    
            });
    };
    

    【讨论】:

    • 就是这样..谢谢!就在我感觉自己已经掌握了一些新东西的时候。 :-)
    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 2018-06-08
    • 2018-06-29
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多