2015-10-12 17 views
5

Ho un piccolo modulo che funge da modello per i miei dati. Si trova tra i miei percorsi e il mio database per dati particolari (dati utente nel mio caso).Lanciare un errore in node.js

Ho bisogno di questo modulo nel mio codice di instradamento, chiamo il metodo subscribe che ha e che abbona un utente a una particolare mailing list, memorizzando i dati necessari nel mio database. Sìì!

Il mio metodo "iscriviti" accetta un email e un ID dell'elenco di posta elettronica come i due parametri. È ragionevole scrivere codice sciatto e veloce e inserire un id per un elenco che non esiste. Errore di ortografia, lo chiami.

Come posso generare un errore e indicare il numero di riga con quell'ID errato?

Codice dall'interno modello/user.js:

if (emailLists.indexOf(listId) === -1) { 
    throw new Error('listId does not exist'); 
} 

Codice da route.js interna:

user.subscribe('[email protected]', 'knewsletterr', function (error, success) { 
    if (error) { return sendResponse(500, 'Ahhhhhhh!'); } 
    if (!error) { return sendResponse(200, 'subscribed'); } 
}); 

In questo momento, sto ottenendo:

/home/.../project/models/user.js:85 
if (emailLists.indexOf(listId) === -1) { throw new Error('listId does not exist'); } 
               ^
Error: listId does not exist 
+0

La variabile listId non è definita nel codice sorgente –

+0

Haha, lo so. Sono io a lanciare l'errore. Voglio solo sapere come inserire il numero di riga e il nome file appropriati insieme all'errore. – Costa

+1

var e = new Error ("asdf"); console.log (e.stack) –

risposta

7

Se stai usando callback nodo-stile, la convenzione non è quello di throw, invece si passa errore come primo argomento al 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) 
 
})

Tipo di una funzione stupida per utilizzare una richiamata dal momento che può essere scritto in modo puramente sincrono, ma spero che questo illustra il modello


La vostra funzione potrebbe già essere scritta in modo sincrono - non preoccupatevi tho, possiamo convertirlo in un nodo di stile funzione di callback utilizzando qualcosa di simile cps2 sotto

// 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


Tutto ciò detto, la maggior parte dei popoli stanno usando promesse oggi

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


Continuazioni sono solo funzioni di tho in modo da poter scrivere questo genere di cose in alcun modo che ti piace - non credo è necessario utilizzare il nodo in stile "callback" o promesse solo perché questo è l'unico modo in cui l'avete visto

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

+0

Grazie, è utile! Questo è il primo approccio che ho preso, ma faccio tre cose diverse a seconda di cosa succede quando si abbona qualcuno ("già sottoscritto", "successo", "qualche altro errore") quindi è stato complicato separare le cose concettualmente. Forse dovrei semplicemente trattare l'errore come se l'app non eseguisse errori e gestire i risultati per tutto il resto come regola. – Costa

+0

In generale, 'throw' è un metodo sincrono per gestire gli errori. Quando si usano i callback, si presume che si abbia a che fare con un codice asincrono in cui 'throw' non sarà particolarmente utile. L'idea è che non devi prendere l'errore in ogni callback della tua catena. Se non vuoi gestire un errore nel mezzo, puoi semplicemente passarlo con 'done (err, x);' Se 'err' è' null', non succederà nulla, ma se 'err' è un' Errore', la funzione sopra ha la possibilità di prenderla. – naomik

+1

Tutto ciò detto, ciò non significa che questo è il modo * migliore * per progettare la gestione degli errori asincroni. Capita solo di essere la convenzione nel nodo e quindi è probabilmente la scelta migliore * se * stai scrivendo un'app/lib che gli altri finiranno per usare.Se stai semplicemente scrivendo l'app per te stesso, puoi progettare la gestione degli errori, tuttavia ritieni che sia meglio per te e utilizzare la convenzione del nodo in cui ti stai interfacciare con altre librerie. – naomik

2

This ti aiuterò !

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>

+0

Grazie, ho letto quella pagina MDN. È la traccia dello stack node.js, credo di avere problemi con. Lo ammetto, sono un po 'confuso a questo punto. – Costa

+1

così: https://www.joyent.com/developers/node/design/errors#appendix-conventional-properties-for-error-objects – Anonymous0day

Problemi correlati