2011-10-18 10 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