2017-01-27 3 views
1

Ich habe in Mongoose docs gegraben, aber ich kann immer noch nicht die Informationen finden, wie ich Fehler in query.exec() behandeln sollte.Korrekte Fehlerbehandlung in mongoose query.exec()

var query = User.findOne({_id: userId}); 

    var promise = query.exec(function(err) { 
     if (err) { 
      res.json(err); 
      return; 
     } 
    }); 
    promise.then(function(user) { 
     res.json(user.name); 
    }); 

Wenn ich pass falsch userId, ich bin Unhandled rejection CastError: Cast to ObjectId failed Fehler immer auf der Konsole ausgegeben.

Ich dachte, dass res.json(err) von return Anweisung gefolgt ausreichen wird, um den Fehler korrekt und verhindert, dass es zu handhaben von in der Konsole angezeigt werden, aber es ist nicht. Was soll ich stattdessen tun?

+1

Sie verspricht verwenden, warum Sie fangen nicht verwenden, anstatt Rückruf in exec promise.catch (function (err) {}) –

+0

@AsifSaeed Danke, genau das musste ich wissen! – CorrieSparrow

+0

Ich war der erste mit der Antwort bekam nichts: D –

Antwort

2

Mit Rückruf:

var query = User.findOne({_id: userId}); 
query.exec(function (err) { 
    if (err) { 
     // handle error 
     return; 
    } 
    // handle success 
}); 

Mit Versprechen:

var query = User.findOne({_id: userId}); 
query.exec().then(function() { 
    // handle success 
}).catch(function (err) { 
    // handle error 
}); 

Derzeit mischen Sie diese beiden Stile. Wählen Sie einen Stil und bleiben Sie dabei.

1

Mit minimalen Änderung an Ihrem Code:

var query = User.findOne({_id: userId}); 

    var promise = query.exec(function(err) { 
     if (err) { 
      res.json(err); 
      return Promise.reject(err); // Updated this line 
     } 
    }); 
    promise.then(function(user) { 
     res.json(user.name); 
    }); 

Mit Versprechungen richtig:

User.findOne({_.id: userId}) 
    .then(function(user) { 
    return res.json(user.name); 
    }) 
    .catch(function(err) { 
    return res.json(err); 
    });