2011-10-18 16 views
5

Aquí es un ejemplo aislado del problema:Mongoose.js se traga errores en guardar devolución de llamada?

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

Cualquier error que se produce en el interior de la devolución de llamada ahorrar produce ninguna salida en la consola. La ejecución parece detenerse en esa línea.

¿Por qué sucede esto?

¿Existe alguna forma mejor de escribir devoluciones de llamada, quizás utilizando una Promesa?

+0

abrió una causa para este problema como adjuntar al evento de error no tiene ningún efecto sobre los errores de devolución de llamada: https://github.com/Automattic/mongoose/issues/3273 – BrutalDev

Respuesta

5

Puede utilizar el objeto de conexión de error evento:

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

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

Esto aún no funciona, los errores aún se tragan y el lanzamiento en el tercer guardado no tiene ningún efecto, no se imprime nada diferente en la consola. Todavía estoy investigando esto. – BrutalDev

Cuestiones relacionadas