2015-10-12 24 views
5

Verilerim için model olarak davranan küçük bir modül var. Rotalarım ile belirli veriler için veritabanım arasında duruyor (benim durumumdaki kullanıcı verileri).node.js'de bir hata atma

Bu modülü benim yol kodumda kullanmam gerekiyor, sahip olduğu subscribe yöntemini çağırın ve gerekli verileri veritabanımda saklayarak belirli bir e-posta listesine abone oluyor. Yuppi!

Benim 'abone' yöntemim iki parametre olarak bir e-posta ve e-posta listesi kimliğini kabul eder. Eğik ve hızlı kodlarım ve mevcut olmayan bir liste için bir kimlik koyacağım mantıklı. Yazım hatası, siz adlandırın.

Bir hatayı nasıl atabilirim ve bu yanlış no ile satır numarasına nasıl işaret edebilirim? iç model/user.js gelen

Kodu: iç route.js dan

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

Kodu: Şu anda

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

, ben alıyorum:

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

listId değişkeni, kaynak kodunuzda tanımlanmamış –

+0

Haha, biliyorum. Hatayı atan kişi benim. Sadece hata ile birlikte uygun satır numarasını ve dosya adını nasıl atacağımı bilmek istiyorum. – Costa

+1

var e = yeni Hata ("asdf"); console.log (e.stack) –

cevap

7

Düğüm tarzı geri aramalar kullanıyorsanız, kongre yerine geri çağrısına ilk argüman olarak size hatayı geçmek throw değildir

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

Geri aramak için aptalca bir işlev türü Bu tamamen senkron şekilde yazılmıştır, ama umarım bu deseni


göstermektedir edilebilir beri İşleviniz zaten senkron bir şekilde yazılmış olabilir

- tho merak etmeyin, biz bir düğüm tarzı dönüştürebilirsiniz

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


tümü aşağıda cps2 gibi geri çağırma işlevi kullanarak şey sanmıyorum - söyledi, çoğu halkları


continuations böylece istediğiniz herhangi bir şekilde bu tür şeyleri yazabilir tho sadece işlevleri vardır

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
günümüzde Promises kullanıyor Eğer böyle mi

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
gördüğüm tek yolu sırf düğüm tarzı "geri aramalar" veya Promises kullanmak zorunda

+0

Teşekkürler, bu yararlı! Bu benim aldığım ilk yaklaşımdı, ama birisine ('zaten abone', 'başarı', 'başka bir hata') abone olduğunuzda ne olduğuna bağlı olarak üç farklı şey yapıyorum, bu yüzden kavramsal olarak şeyleri ayırmak zor oldu. Belki de uygulama hatalar yapmayacak ve sonuçları bir kural olarak ele alacaktır. – Costa

+0

Genel olarak, "throw", hataları işlemek için eşzamanlı bir yöntemdir. Geri aramaları kullanırken, "acele" nin özellikle yararlı olmayacağı bir zaman uyumsuz kodla uğraştığınız varsayılır. Buradaki fikir, zincirin içindeki her geri aramada "err" 'i yakalamak zorunda değilsiniz. Eğer ortada bir hatayla uğraşmak istemiyorsan, bunu sadece "bitmiş" (err, x); "eğer" err "null" ise, hiçbir şey olmayacak, ama eğer "err" ise Hata ', yukarıdaki işlevin onu yakalama şansı var. – naomik

+1

Bunların hepsi, bu, uyumsuzluk hatalarını ele alma biçiminin * en iyi * yolu olduğu anlamına gelmez. Düğümde yer alan bir kuraldır ve bu yüzden muhtemelen en iyi seçimdir. * Eğer bir uygulamanın/librenin başkalarının kullanacağı bir program yazıyorsanız.Uygulamayı sadece kendiniz için yazıyorsanız, hata işlemenizi tasarlayabilirsiniz, ancak sizin için en iyisi olduğunu hissedersiniz ve sadece diğer lib'lerle arayüz oluşturduğunuz düğüm konvansiyonunu kullanabilirsiniz. – naomik

2

This sana yardım edeceğim !

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

Teşekkürler, bu MDN sayfasını okudum. Sorun yaşıyorum düşünüyorum node.js yığın izlemesi var. Kabul ediyorum, bu noktada biraz kafam karıştı. – Costa

+1

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

İlgili konular