3

セットアップ: nodejs、express、mongodb、mongoose

関連コード:

var express = require('express');
var server = express();
server.use(express.bodyParser());
server.use(express.methodOverride());
server.use(server.router);

var mongoose = require('mongoose');
mongoose.connect('localhost', 'test');
var Schema = mongoose.Schema;
var VehicleSchema = new Schema({
    name : String
}, {collection: 'vehicles'});
var Vehicle = mongoose.model('vehicle', VehicleSchema);

server.use(clientErrorHandler);
function clientErrorHandler(err, req, res, next) {
    console.log('client error handler found', err);
    res.send(500, err);
}

server.get('/api/test', function(req, res, next){
    Vehicle.find().exec(function(err, rows){
        res.send(rows);
    });
});

server.listen(1981);

これにより、期待どおりに空の配列が返されます。

ここで例外をスローします:

server.get('/api/test', function(req, res, next){
    throw 'my exception';// <------------------------ here
    Vehicle.find().exec(function(err, rows){
        res.send(rows);
    });
});

clientErrorHandler が例外をキャッチすると、期待どおりに動作します。代わりに、ここに投げます:

server.get('/api/test', function(req, res, next){        
    Vehicle.find().exec(function(err, rows){
        throw 'my exception';// <------------------------ here
        res.send(rows);
    });
});

その後、例外は clientErrorHandler によってキャッチされず、代わりに mongoose/lib/util.js によってキャッチされて再スローされます。

exports.tick = function tick (callback) {
  if ('function' !== typeof callback) return;
  return function () {
    try {
      callback.apply(this, arguments);
    } catch (err) {
      // only nextTick on err to get out of
      // the event loop and avoid state corruption.
      process.nextTick(function () {
        throw err; //<--------------------------------- here 
      });
    }
  }
}

次のようなマングースなしで何かをする:

server.get('/api/test', function(req, res, next){
    process.nextTick(function(){
        throw 'here';
    });
});

急行でも引っかかりません。

エクスプレスではなくマングースに捕まらないようにするにはどうすればよいですか? エラーをキャッチするためにエクスプレスを取得するにはどうすればよいですか? 別のティックでスローされたエラーをキャッチするエクスプレスを取得できますか? (これは私が表現するために報告するべきものですか?)

そのユーザーにメッセージを送り返すことができるようにしたいので、process.errorを避けたいと思います。エラーで「next」を呼び出すことができることに気づきました。他のライブラリからの他の例外についてもっと心配しています。

4

2 に答える 2

9

エラーで「next」を呼び出すことができることに気づきました。他のライブラリからの他の例外についてもっと心配しています。

他のプログラミング言語のバックグラウンドがあるため、これについて心配していると思います(少なくとも私の場合はそうでした)。最終的に、非同期コードで例外が発生する可能性は低いです。これは、Node.jsの規則ではないため、まだ可能です。しかしありそうもありません。これは Isaac Schlueter 自身によるものです。

「ノードのパターンは、同期メソッドがスローされ、非同期メソッドがエラーを最初の引数としてコールバックに渡すことです。コールバックの最初の引数が false (通常は null または未定義) の場合、すべて問題ありません。」 https://groups.google.com/d/msg/nodejs/W9UVJCKcJ7Q/rzseRbourCUJ

于 2013-01-24T15:27:58.297 に答える
4

例外をスローするのではなく、nextコールバックでエラーを返す必要があります。コールバックは、アプリのエラーハンドラーで処理できます。

独自のエラーをスローする可能性のある関数を呼び出す場合は、それらをtry句でラップし、キャッチしたエラーを使用してコールバックを呼び出しますcatch。次に例を示します。

server.get('/api/test', function (req, res, next) {
  process.nextTick(function () {
    try {
      functionWhichWillThrowAnError();
    } catch (error) {
      next(error);
      return;
    }
    res.send('everything is okay!');
  });
});
于 2013-01-24T01:46:20.517 に答える