A lançar um erro no nó.js
preciso deste módulo no meu código de rota, chame o método subscribe
que ele tem, e que subscreve um utilizador para uma lista de correio particular, armazenando os dados necessários na minha base de dados. Viva!
O meu método de 'subscrever' aceita um e-mail e um ID da lista de E-mail como os dois parâmetros. É razoável que eu vá codificar descuidado e rápido e colocar numa identificação para uma lista que não existe. Erro ortográfico, é só dizer.
Como posso lançar um erro e apontar para o número da linha com essa identificação incorrecta?código de dentro do modelo / utilizador.js:
if (emailLists.indexOf(listId) === -1) {
throw new Error('listId does not exist');
}
código de dentro da rota.js:
user.subscribe('[email protected]', 'knewsletterr', function (error, success) {
if (error) { return sendResponse(500, 'Ahhhhhhh!'); }
if (!error) { return sendResponse(200, 'subscribed'); }
});
Neste momento, estou a receber ...
/home/.../project/models/user.js:85
if (emailLists.indexOf(listId) === -1) { throw new Error('listId does not exist'); }
^
Error: listId does not exist
2 answers
Se você está usando callbacks tipo nó, A Convenção não é para throw
, em vez de passar Você erro como o primeiro argumento para a sua callback
// divide with callback
function div (x, y, done) {
if (y === 0)
return done (Error ('Cannot divide by zero'))
else
return done (null, x / y)
}
div (6, 3, function (err, result) {
// *always* check for err
if (err)
console.log ('error', err.message, err.stack)
else
console.log ('result', result)
})
É uma função estúpida para usar uma chamada de volta, uma vez que pode ser escrita de uma forma puramente síncrona, mas espero que isto ilustra o padrão
A sua função já pode ser escrita de uma forma síncrona - não se preocupe tho, podemos convertê - la para uma função de callback tipo nó usando algo como cps2
abaixo de
// a "normal" synchronous function that throws an error
const div = (x,y) =>
{
if (y === 0)
throw Error ('cannot divide by zero')
else
return x / y
}
// convert it to a continuation passing style (cps) function
const cps2 = (f, x, y, k) =>
{
try {
return k (null, f (x, y))
}
catch (err) {
return k (err)
}
}
// logging utility for demos below
const logger = (err, result) =>
{
if (err)
console.log ('error:', err.message, err.stack)
else
console.log ('result:', result)
}
cps2 (div, 6, 3, logger)
// result: 2
cps2 (div, 6, 0, logger)
// error: cannot divide by zero
Dito isto, a maioria das pessoas usa promessas hoje em dia.
const div = (x, y, done) =>
{
if (y === 0)
return done (Error ('cannot divide by zero'))
else
return done (null, x / y)
}
const promisify = f => (...args) =>
new Promise ((resolve, reject) =>
f (...args, (err, result) =>
{
if (err)
reject (err)
else
resolve (result)
}))
const logp = p =>
p.then (console.log, console.error)
logp (promisify (div) (6, 3))
// 2
logp (promisify (div) (6, 0))
// Error: cannot divide by zero
Continuações são apenas funções tho para que você possa escrever este tipo de coisa de qualquer maneira que você gosta-não pense que você tem que usar "callbacks" em estilo de nó ou promessas só porque essa é a única maneira que você viu isso
const cont = (...values) =>
k => k (...values)
const div = (x, y) =>
y === 0
? cont (Error ('cannot divide by zero'))
: cont (null, x / y)
const log = (err, result) =>
err
? console.log ('error:', err.message)
: console.log ('result:', result)
div (6, 3) (log)
// result: 2
div (6, 0) (log)
// error: cannot divide by zero
var el = document.getElementById('el');
var log = function( val ){
el.innerHTML+= '<div><pre>' + val + '</pre></div>';
};
try {
throw Error('error in code');
} catch (e) {
log( e.message );
log( e.fileName );
log( e.lineNumber );
log( e.stack );
};
<div id='el'></div>