【问题标题】:How to keep the node server running?如何保持节点服务器运行?
【发布时间】:2017-03-24 02:37:16
【问题描述】:

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

非常感谢。

【问题讨论】:

  • 只是不要抛出你当前抛出的错误。

标签: angularjs node.js mongodb


【解决方案1】:

您的应用停止的原因是当save() 返回错误时,您正在使用throw

这会导致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' )});

【讨论】:

    【解决方案2】:

    当您向服务器抛出错误时,服务器将停止。在下面的代码中,您需要优雅地处理错误。

    newUser.save(function(err){
                    if(err) throw err; // handle gracefully
                    return done(null, newUser);
                });
    

    【讨论】:

      【解决方案3】:

      您应该处理错误而不是抛出它。处理错误后,您应该向客户端(AngularJS 应用程序)发送适当的 HTTP 状态/消息,然后它会根据可能的服务器响应进行操作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-28
        • 2013-01-26
        • 2020-02-02
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 2018-03-18
        • 2017-04-29
        相关资源
        最近更新 更多