node.js - tutorial - visual node js
Error de captura personalizada no funciona en Bluebird (1)
Intento tirar y luego detectar un error personalizado en una cadena de promesa de Bluebird, pero no puedo obtener el error personalizado. Por ejemplo:
function login(req, res, next) {
function LoginError() {}
return User.where(''id'', req.body.userId).fetch()
.then(function (location) {
if (req.body.password !== location.get(''password'')) {
throw new LoginError();
}
// returns a promise
return Subscription.where(''userId'', location.get(''userId'')).fetch();
})
.then(function (subscription) {
return res.send(JSON.stringify(subscription));
})
.catch(LoginError, function (err) {
return res.send(''Login error'');
})
.catch(function (err) {
res.send(''Other error: '' + JSON.stringify(err));
});
}
Cuando la contraseña no coincide y arroja LoginError
, el error se LoginError
en el segundo bloque catch, no en el bloque catch para LoginError
. ¿Qué estoy haciendo mal?
Estoy usando Express.js, Bluebird y Bookshelf / Knex, donde el User
es un modelo de estantería.
Bluebird distingue los constructores de error de las funciones de predicado en una catch
por su herencia:
Para que un parámetro se considere como un tipo de error que desea filtrar, necesita que el constructor tenga su propiedad
.prototype
comoinstanceof Error
.Tal constructor puede crearse mínimamente así:
function MyCustomError() {} MyCustomError.prototype = Object.create(Error.prototype);
Deberá hacer lo mismo con su LoginError
.
O si está utilizando ES6, la class LoginError extends Error {}
.