如何保持节点服务器运行?

时间:2017-03-23 18:20:10

标签: angularjs node.js mongodb

在本地,当我的代码通过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]

非常感谢。

3 个答案:

答案 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状态/消息,然后它将根据可能的服务器响应进行操作。