5

node.js の Express と統合された swagger を使用する API と、以下のように定義されたリソースがあります。(!req.params.id) のチェックでスローされた swagger エラーは、swagger の既定のエラー ハンドラーによってキャッチされます。mongoDB 削除呼び出しからのコールバックでスローされたエラーはキャッチされず、以下のエラーが表示されます。エラーは、コールバック関数のスコープ/順序に関係しているように見えます.node.jsの初心者として、非同期性を維持しながらこれを適切に行う方法についてアドバイスを得たいと思っていました. -ありがとう

events.js:74 throw TypeError('Uncaught, unspecified "error" event.'); ^ TypeError: キャッチされていない、特定されていない「エラー」イベント。

exports.remove = {
    'spec' : {
      "collapsed...for...brevity..." : "...",
      "params" : [ {
        "paramType" : "path",
        "name" : "id",
        "collapsed...for...brevity..." : "...",
      }],
      "errorResponses" : [ swe.notFound('id'), swe.invalid('id') ],
      "nickname" : "remove"
    },
    'action' : function(req, res) {

      if (!req.params.id) {
        throw swe.invalid('id');   // THIS ERROR IS CAUGHT
      }

      req.coll.remove({_id : req.coll.id(req.params.id)}, function(e, result) {
        if (e) {
          throw swe.invalid('collection');   // THIS ERROR IS NOT CAUGHT
        }

        res.send({msg : 'success'});
      });
    }
  };
4

3 に答える 3

6

非同期コールバック内でスローされた例外は、周囲のコードではなく、コールバックの呼び出し元に送られます。したがってreq.coll.remove、例外を受け取り (それを処理していない)、アプリをクラッシュさせるのはコードです。

action代わりに、呼び出し元にエラーを返すために使用できるコールバック パラメーターをremove 関数で受け入れる必要があります。

これが、例外が node.js コードでめったに使用されず、コールバックが標準である理由です。

于 2013-11-14T17:11:02.057 に答える
1

コールバックを使用する代わりに、promise を使用し、promise チェーン内で例外をスローします...

var P = require('bluebird');

// ...

return new P(function(resolve, reject) {
  req.coll.remove({_id : req.coll.id(req.params.id)}, function(e, result) {
    if (e) {
      reject(swe.invalid('collection'));   // THIS ERROR will be CAUGHT
    }
    resolve(res.send({msg : 'success'}));
  });
})
.catch(function(err) {
  throw err;
});
于 2016-05-01T05:58:11.160 に答える