2015-10-12 9 views
5

私のデータのモデルとして機能する小さなモジュールがあります。特定のデータ(私の場合はユーザーデータ)のために私のルートと私のデータベースの間にあります。node.jsでエラーをスローする

私のルートコードにこのモジュールが必要ですが、それは持っているsubscribeメソッドを呼び出し、データベースに必要なデータを格納することで特定のメーリングリストに加入します。わーい!

私の「購読」メソッドは、2つのパラメータとして電子メールと電子メールリストIDを受け入れます。それは、私が不潔で速くコード化し、存在しないリストのIDを入れることは合理的です。スペルミス、あなたはそれを命名します。

エラーが発生し、そのIDが正しくない行番号を指し示すにはどうすればよいですか?モデル/ user.jsの内側から

コード:

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

コード内部route.jsから:今

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

、私は取得しています:

/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変数が –

+0

はハハ、私は知っているあなたのソースコードで定義されていません。私はエラーを投げる人です。私はちょうどエラーと一緒に適切な行番号とファイル名をスローする方法を知りたい。 – Costa

+1

var e =新しいエラー( "asdf"); console.log(e.stack) –

答えて

7

あなたはノードスタイルのコールバックを使用している場合、慣例ではなく、あなたのコールバックに最初の引数として、あなたにエラーを渡す、throwにない

// 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) 
 
})
コールバックを使用するには、愚かな機能の

種類それは、純粋に、同期の方法で書かれていますが、うまくいけば、これはパターン


を示していることができるので、 あなたの機能がすでに同期の方法で書き込まれることがあります

- カントー心配しないで、我々はノードスタイルに変換することができますすべての

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


以下cps2のようなものを使用してコールバック関数思わない - それは言ったのは、ほとんどの人々は


継続のはそうあなたが好きなようにこの種のものを書くことができますカントーだけで機能している

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
、今日の約束を使用していますあなたはそれはあなたがそれ

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

ありがとうございました!それは私が取った最初のアプローチですが、あなたが誰かを購読するとき(「購読済み」、「成功」、「何らかの他のエラー」)に何が起こるかによって3つの異なることが起こります。たぶん私はアプリケーションがエラーを実行しないようにエラーを処理し、他のすべての結果をルールとして処理する必要があります。 – Costa

+0

一般に、「スロー」はエラーを処理する同期メソッドです。コールバックを使用する場合、非同期コードを処理しているとみなされます。この場合、 'throw 'は特に有用ではありません。アイデアは、チェーン内のすべてのコールバックで 'err'をキャッチする必要がないということです。途中でエラーを処理したくない場合は 'done(err、x);に渡すだけです'もし 'err'が' null'ならば何も起こりませんが 'err'が'エラー '、上記の関数はそれをキャッチする機会があります。 – naomik

+1

これはすべて、非同期エラー処理を設計する最良の方法であるとは限りません。それはちょうどノードでの大会であるため、おそらく他の人が使用するapp/libを書く場合にはおそらく最良の選択です*。あなた自身のためだけにアプリケーションを書いているのであれば、エラー処理を設計することができますが、他のライブラリとインターフェースするノードコンベンションを使用するのが最適です。 – naomik

2

Thisが手伝う !

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

ありがとう、私はそのMDNページを読んだ。それはnode.jsのスタックトレースです。問題があると思います。私は、この時点で少し混乱していると認めます。 – Costa

+1

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

関連する問題