A lançar um erro no nó.js

Tenho um módulo minúsculo que funciona como modelo para os meus dados. Ele fica entre minhas rotas e meu banco de dados para dados específicos (dados de usuário no meu caso).

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
Author: Costa, 2015-10-12

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
 13
Author: user633183, 2017-09-23 16:52:03

Isto vai ajudar-te !

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>
 3
Author: Anonymous0day, 2015-10-12 17:15:40