2011-10-18 30 views
5

Dưới đây là một ví dụ cô lập của vấn đề:Mongoose.js nuốt lỗi trong lưu gọi lại?

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

Bất kỳ lỗi ném bên trong lưu callback sản xuất không có đầu ra trong giao diện điều khiển. Việc thực hiện dường như tạm dừng ở dòng đó.

Tại sao điều này lại xảy ra?

Có cách nào tốt hơn để viết gọi lại, có thể sử dụng Lời hứa?

+0

Khai trương một trường hợp cho vấn đề này là gắn với sự kiện lỗi không ảnh hưởng đến các lỗi callback: https://github.com/Automattic/mongoose/issues/3273 – BrutalDev

Trả lời

5

Bạn có thể sử dụng đối tượng kết nối lỗi sự kiện:

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

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

Điều này vẫn không hoạt động, lỗi vẫn còn bị nuốt và ném trong lần lưu thứ ba không có hiệu lực, không có gì khác biệt được in trên bảng điều khiển. Vẫn đang điều tra điều này. – BrutalDev

Các vấn đề liên quan