2017-03-23 104 views
-2

本地,當我的代碼通過貓鼬把一些數據放入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); 
      });    
     } 
    }); 

與上面的代碼,如果有重複的條目我從貓鼬錯誤11000和服務器停止。我需要編輯return err嗎?我需要通過發送給客戶端的消息來保持服務器運行(Angular),並且不會登錄到會導致服務器崩潰的控制檯。我對MEAN相當陌生,仍在學習。如果ID不重複,上面的代碼完美。 [我有id字段爲unique]

非常感謝。

+2

只是不要拋出你當前拋出的錯誤。 –

回答

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); 
}); 

要給出一個更端至端例子假設你使用快速從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')}); 
012處理請求到數據庫
+0

我錯過了「完成(錯誤)」。非常感謝你。 – Somename

1

服務器將在您拋出並且出錯時停止。在你的代碼中,你需要優雅地處理錯誤。

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

你應該處理錯誤而不是拋出它。在處理錯誤時,您應該向客戶端發送適當的HTTP狀態/消息(AngularJS應用程序),然後在此處處理可能的服務器響應。