2011-10-18 11 views
5

這是問題的一個孤立的例子:Mongoose.js吞下保存回調中的錯誤?

var assert = require('assert') 
var mongoose = require('mongoose') 
var Schema = mongoose.Schema 
    , ObjectId = Schema.ObjectId; 

mongoose.connect("mongodb://localhost/some_db"); 

var BlogPostSchema = new Schema({ 
    title  : String 
    , body  : String 
    , date  : Date 
}); 

var BlogPost = mongoose.model('BlogPost', BlogPostSchema); 

var bp = new BlogPost({title: 'blogpost 0'}) 
bp.save(function(err) { 
    console.log("this will print 0") 
    assert.equal(1, 1) 
    console.log("0 ... no problem") 
}) 

var bp1 = new BlogPost({title: 'blogpost 1'}) 
bp1.save(function(err) { 
    console.log("this will print 1") 
    assert.equal(1, 2) 
    console.log("this will NOT print") 
}) 

var bp2 = new BlogPost({title: 'blogpost 2'}) 
bp2.save(function(err) { 
    console.log("this will print 2") 
    throw "this error is swallowed" 
    console.log("this will NOT print") 
}) 

保存回調內部拋出的任何錯誤產生在控制檯沒有輸出。執行似乎暫停在該行。

爲什麼會發生這種情況?

有沒有更好的方法來編寫回調,也許使用Promise?

+0

打開的情況下這個問題,因爲連接到錯誤事件對回調錯誤沒有影響:https://github.com/Automattic/mongoose/issues/3273 – BrutalDev

回答

5

您可以使用連接對象錯誤事件:

var connection = mongoose.createConnection('mongodb://127.0.0.1/test'), 
    BlogPost = connection.model('BlogPost', BlogPostSchema); 

connection.on("error", function(errorObject){ 
    console.log(errorObject); 
    ... 
}); 
+1

這仍然不起作用,錯誤仍然被吞噬,並且第三次保存中的丟棄沒有任何效果,沒有任何不同之處被打印到控制檯。仍在調查這一點。 – BrutalDev