【问题标题】:Can't set headers after they are sent. NodeJS发送后无法设置标题。节点JS
【发布时间】:2017-09-15 13:15:14
【问题描述】:

以下是我的代码,我首先验证用户是否存在于组中,如果存在,则将帐户推送到数组中并保存。这是通过 /addaccount 上的 POST 请求完成的。

groupRouter.post('/addaccount', Verify.verifyOrdinaryUser, function(req, res, next) {
Groups.findById(req.body.group, function(err,group) {
    if (err) next(err);
    var checkUser = function(user) {
        for(var i=0; i<group.users.length; i++)
        {
            if(group.users[i]==user)
                return true;
        }
        return false;
    }
    if(checkUser(req.decoded._doc._id)){
        User.find({mobile:{$in:req.body.split}}, function(err, users) {
            if(err) next(err); var flag = true;
            if(users.length == req.body.split.length ) {
                for(var i=0; i<users.length; i++) {
                    if(!checkUser(''+users[i]._id)) {
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    var myObject = {};
                    myObject.amount = req.body.amount;
                    myObject.by = req.decoded._doc._id;
                    myObject.split = req.body.split;
                    group.accounts.push(myObject);
                    group.save(function (err, groups) {
                        if(err) next(err);
                        console.log('Added entries');
                        res.json(groups);
                    })
                }
                else
                    res.end('All users not in the group');
            }
            else
                res.end('Split users do not exist');
        })
    }
    else
        res.end('No Permission');
})
})

现在,当我输入一个用户数组并尝试推送一个对象并通过 代码如下:

if(flag) {
                var myObject = {};
                myObject.amount = req.body.amount;
                myObject.by = req.decoded._doc._id;
                myObject.split = req.body.split;
                group.accounts.push(myObject);
                group.save(function (err, groups) {
                    if(err) next(err);
                    console.log('Added entries');
                    res.json(groups);
                })
            } 

我收到一条错误消息:错误:发送后无法设置标头。如下图。

Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:357:11)
at ServerResponse.header (D:\Ionic\PocketBuddies\node_modules\express\lib\response.js:718:10)
at ServerResponse.send (D:\Ionic\PocketBuddies\node_modules\express\lib\response.js:163:12)
at done (D:\Ionic\PocketBuddies\node_modules\express\lib\response.js:957:10)
at Object.exports.renderFile (D:\Ionic\PocketBuddies\node_modules\jade\lib\index.js:374:12)
at View.exports.__express [as engine] (D:\Ionic\PocketBuddies\node_modules\jade\lib\index.js:417:11)
at View.render (D:\Ionic\PocketBuddies\node_modules\express\lib\view.js:126:8)
at tryRender (D:\Ionic\PocketBuddies\node_modules\express\lib\application.js:639:10)
at EventEmitter.render (D:\Ionic\PocketBuddies\node_modules\express\lib\application.js:591:3)
at ServerResponse.render (D:\Ionic\PocketBuddies\node_modules\express\lib\response.js:961:7)
at D:\Ionic\PocketBuddies\app.js:78:7
at Layer.handle_error (D:\Ionic\PocketBuddies\node_modules\express\lib\router\layer.js:71:5)
at trim_prefix (D:\Ionic\PocketBuddies\node_modules\express\lib\router\index.js:310:13)
at D:\Ionic\PocketBuddies\node_modules\express\lib\router\index.js:280:7
at Function.process_params (D:\Ionic\PocketBuddies\node_modules\express\lib\router\index.js:330:12)
at IncomingMessage.next (D:\Ionic\PocketBuddies\node_modules\express\lib\router\index.js:271:10)

我搜索了这个问题,它说我无法在 res.end() 之后更新响应,但是当我调用 res.json 时,我没有看到任何 res.end() 被调用。 请帮我在这里找到问题。 我正在做一个项目,这个错误让我抓狂。

提前致谢

【问题讨论】:

  • 第 78 行的 D:\Ionic\PocketBuddies\app.js 发生了什么?那就是触发错误。此外,您必须在您调用next(err)(所以if (err) return next(err))的每个地方从当前范围返回。我的猜测是发生了错误,您的应用正在呈现错误页面,但由于您没有返回,代码 also 会命中res.json()res.end()(触发错误)。
  • 第 78 行是我在上面调用 group.save() 的地方。
  • 也感谢您的建议,将在 next() 中添加返回
  • 嗯,是的,你是对的,它渲染了一个错误页面,然后还点击了 res.json(),谢谢终于得到了实际的错误!
  • 您的两个循环可以简化:var checkUser = userId =&gt; group.users.includes(userId);var flag = users.every(user =&gt; checkUser(user._id)); 这也可以简化:group.accounts.push({ amount: req.body.amount, by: req.decoded._doc._id, split: req.body.split }) 只需插入几个换行符(不会出现在 cmets 中)跨度>

标签: javascript node.js express mongoose


【解决方案1】:

正如robertklep 正确指出的那样,这里的问题是没有返回错误,因此在错误之后的 group.save() 函数中,它呈现了错误页面并命中了 res.json()这导致了错误。 如果没有错误,它工作正常。 代码需要更新如下,如果发生错误则返回,而不是转到 res.json() 部分。

group.save(function (err, groups) {
                    if(err) return next(err);
                    console.log('Added entries');
                    res.json(groups);
                })

这对我起到了作用,它给了我实际的错误,然后必须在哪些事情正常工作后进行更正。

【讨论】:

    猜你喜欢
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-05
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    相关资源
    最近更新 更多