在本地,当我的代码通过mongoose在mongodb中放入一些数据时,如果出现错误(err)
,则错误会显示在用于启动服务器的命令提示符窗口中。并且节点服务器已停止。这是什么被称为synchronous
?我的代码:
User.findOne({id:myid}, function(err, user){
if(err) return done(err);
if(user) return done(null, user);
else{
var newUser = new User();
newUser.name = myname;
newUser.id = myid
newUser.save(function(err){
if(err) throw err;
return done(null, newUser);
});
}
});
使用上面的代码,如果有重复的条目,我从mongoose收到错误11000
,服务器停止。我需要编辑return err
的任何地方吗?我需要通过发送到客户端(Angular)的消息来保持服务器运行,而不是在崩溃服务器的控制台中登录。我对MEAN
还很新,还在学习。如果id不重复,上面的代码是完美的。 [我将id
字段设为unique
]
非常感谢。
答案 0 :(得分:1)
当throw
返回错误时,您的应用停止的原因是您正在使用save()
。
这会在process
对象上产生'uncaughtException'
事件,如果它没有侦听器,则会导致您的进程退出。
通常在Node.js中你不使用throw
,除非应用程序停止或代码是同步的(IE JSON.parse()
)
您应该在Node.js中使用错误第一个回调约定后,将错误发送回调用者
newUser.save(function(err) {
if(err)
return done(err); // Let caller handle error
return done(null, newUser);
});
提供更多的端到端示例,假设您使用Express处理来自HTTP请求的数据库请求
const express = require('express');
const app = express();
const bodyParser = require('body-parser);
app.use(bodyParser.json());
const createUser = function(myid, myname, done)
User.findOne({id:myid}, function(err, user){
if(err)
return done(err);
if(user)
return done(null, user);
var newUser = new User();
newUser.name = myname;
newUser.id = myid
newUser.save(function(err){
if(err)
return done(err)
return done(null, newUser);
});
}
});
app.post('/users', function(req, res) => {
if (!req.body.myid || !req.body.myname)
return res.status(400).send('missing myid or myname from request body')
createUser(req.body.myid, req.body.myname, (err, newUser) => {
if(err)
return res.status(500).send(err); // Typically some error handling goes here
return res.status(201).send(newUser);
}
});
app.listen(process.env.PORT || 1337, () => { console.log('Listening' )});
答案 1 :(得分:1)
当您抛出并向其发送错误时,服务器将停止。在下面的代码中,您需要优雅地处理错误。
newUser.save(function(err){
if(err) throw err; // handle gracefully
return done(null, newUser);
});
答案 2 :(得分:1)
您应该处理错误而不是抛出错误。在处理错误时,您应该向客户端(AngularJS应用程序)发送适当的HTTP状态/消息,然后它将根据可能的服务器响应进行操作。