2016-07-11 63 views
0

当我尝试使用Web表单更新用户时,它在express上运行app.post。该对象的用户是正确的,但有时它抛出节点控制台mongodb更新引发严重错误

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: '[email protected]', 
    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

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

具体是这几行代码。

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

你在做什么,如果是有错误发送状态400,然后发送状态201的问题是,一旦你发送你的头以请求的响应,你不能尝试并设置头再次。

所以,你的代码应该更改为:

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

因此,如果产生一个错误,你将发送400响应,否则你将发送201响应,而不是试图发送一个400响应,然后201响应之后立马。