mongodb更新正在抛出一个严重的错误

时间:2016-07-11 11:53:18

标签: node.js mongodb express

当我尝试使用网络表单更新用户时,它会在快递上运行app.post。对象用户是正确的,但有时它会在节点控制台中引发错误

app.post('/register/update', jsonParser, (request, response) => {
  let user = request.body.user;
  let users = mongoUtil.users();

  console.log(user);

  users.update({email: user.email}, user, (err, res) => {
    if(err) {
      response.sendStatus(400);
    }
    response.sendStatus(201);
  });
});

在节点控制台中:

{ _id: '578246ec9eb0587a5d67b8c9',
  email: 'test@test.com',
  zipcode: '1231-123',
  companyName: 'test',
  tradeName: 'test',
  contactName: 'Test',
  tel: '(14) 1232-1231',
  password: 'test',
  passwordConfirm: 'test',
  adress: 'test',
  adressComplement: 'test',
  adressNumber: '123' }
/home/ec2-user/ ... /mongodb/lib/utils.js:98
    process.nextTick(function() { throw err; });
                                  ^

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11)
    at ServerResponse.header (/home/ec2-user/ ... /node_modules/express/lib/response.js:719:10)
    at ServerResponse.contentType (/home/ec2-user/ ... /node_modules/express/lib/response.js:552:15)
    at ServerResponse.sendStatus (/home/ec2-user/ .. /node_modules/express/lib/response.js:340:8)
    at users.update (/home/ec2-user/menuWebApp/server/app.js:94:14)
    at handleCallback (/home/ec2-user/ ... /node_modules/mongodb/lib/utils.js:96:12)
    at /home/ec2-user/ ... /node_modules/mongodb/lib/collection.js:1008:42
    at commandCallback (/home/ec2-user/ ... /node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:1194:9)
    at Callbacks.emit (/home/ec2-user/ ... /node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:119:3)
    at Connection.messageHandler (/home/ec2-user/ ... /node_modules/mongodb/node_modules/mongodb-core/lib/topologies/server.js:358:23)

我可能正在处理一个回调问题,但我不知道如何解决它D:

1 个答案:

答案 0 :(得分:1)

错误不是来自更新语句本身来自您的回调函数。

特别是这些代码行。

if(err) {
  response.sendStatus(400);
}
response.sendStatus(201);

您正在做的是如果发生错误则发送状态400,然后发送状态201.问题是,一旦您将带有标题的响应发送给请求者,您就不能再尝试设置标题。 / p>

所以你的代码应该改为:

if(err) {
   response.sendStatus(400);
}else{
   response.sendStatus(201);
}

因此,如果生成错误,您将发送400响应,否则您将发送201响应,而不是尝试发送400响应,然后立即发送201响应。