2017-07-30 14 views
0

私はnode.js(express)を使って簡単なAPIを書く方法を知っています。しかし、今、私は混乱していると明示的にエラーを返すとエラーを返す

if(err){ return res.status(500).json(err) } 
return res.json(result) 

if(err) { throw new Error(err) } 
return res.json(result) 

APIレスポンスのための基準は何ですか

対コードのこの2つのブロックを区別することができませんでしたか?

if(err){ return res.json({ status: false, msg: 'user password is incorrect }) } 
return ({ status: true, msg: result.token }) 

私は2つのプロパティを返すだけです。なぜ私のアプローチが間違っていて、なぜスローを使用すべきですか?

答えて

0

通常、Expressにはエラーが発生しない限り、ユーザーの警告なしにプロセスがクラッシュし、エラーをキャッチしてリクエストコンテキストを維持するのは容易ではないためさもないと。

Expressハンドラの選択肢は、エラー応答を直接返すか(例のように)、next(err)を呼び出すことです。私のアプリでは、いつも一貫してさまざまな問題のケースを処理するためのエラー処理ミドルウェアをセットアップできるので、後者はいつもやっています。以下

例:

app.get('/something', (req, res, next) => { 
    // whatever database call or the like 
    Something.find({ name: 'something'}, (err, thing) => { 
    // some DB error, we don't know what. 
    if (err) return next(err); 
    // No error, but thing wasn't found 
    // In this case, I've defined a NotFoundError that extends Error and has a property called statusCode set to 404. 
    if (!thing) return next(new NotFoundError('Thing was not found')); 
    return res.json(thing); 
    }); 
}); 

そして、そのようなエラーを処理するためのいくつかのミドルウェア:Expressのほぼすべてが、ミドルウェアを介して行われ

app.use((err, req, res, next) => { 
    // log the error; normally I'd use debug.js or similar, but for simplicity just console in this example 
    console.error(err); 

    // Check to see if we have already defined the status code 
    if (err.statusCode){ 
    // In production, you'd want to make sure that err.message is 'safe' for users to see, or else use a different value there 
    return res.status(err.statusCode).json({ message: err.message }); 
    } 
    return res.status(500).json({ message: 'An error has occurred, please contact the system administrator if it continues.' }); 
}); 

注意。

+0

いくつかのコードを表示できますか?次のこと(エラー)はどのような結果をもたらすでしょうか?私のAPIのほとんどはミドルウェアを持っていません。 –

+0

エラーを処理するためにどのようなミドルウェアをお勧めしますか? –

+0

私が示したものは?ノード内のミドルウェアは単なるハンドラ関数です。場合によっては、モジュールを使用してそれを行うこともできますが、そうする必要はありません。私が言及した上記のものを包む方法として、プラーター(https://www.npmjs.com/package/praeter)を書いたが、自分のコードで簡単にやり遂げることができる。 – Paul