セットアップ: 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」を呼び出すことができることに気づきました。他のライブラリからの他の例外についてもっと心配しています。