Wil*_*ver 3 mongoose node.js express
设置: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);
Run Code Online (Sandbox Code Playgroud)
这将按预期返回一个空数组.
在这里抛出异常:
server.get('/api/test', function(req, res, next){
throw 'my exception';// <------------------------ here
Vehicle.find().exec(function(err, rows){
res.send(rows);
});
});
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,clientErrorHandler捕获异常.相反,扔在这里:
server.get('/api/test', function(req, res, next){
Vehicle.find().exec(function(err, rows){
throw 'my exception';// <------------------------ here
res.send(rows);
});
});
Run Code Online (Sandbox Code Playgroud)
然后,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
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
做一些没有猫鼬的事情,例如:
server.get('/api/test', function(req, res, next){
process.nextTick(function(){
throw 'here';
});
});
Run Code Online (Sandbox Code Playgroud)
也没有被快递抓住.
我如何避免它被猫鼬而不是表达?我怎样才能表达以发现错误?我可以获得快递以捕获单独的勾号上的错误吗?(这是我要报告的内容吗?)
我想避免process.error,因为我希望能够将消息发送回该用户.我意识到可以用错误调用'next',我更关心来自其他库的其他异常.
我意识到可以用错误调用'next',我更关心来自其他库的其他异常.
我怀疑你是关心这个,因为你的背景与其他编程语言(至少这是我的情况.)最后,你不太可能看到异步代码中的异常,因为这不是Node.js中的约定,它仍然是可能的但不太可能.这是来自Isaac Schlueter本人:
"节点中的模式是同步方法抛出,异步方法将错误作为回调的第一个参数传递.如果回调的第一个参数是假的(通常为null或未定义),那么一切都与世界相符." https://groups.google.com/d/msg/nodejs/W9UVJCKcJ7Q/rzseRbourCUJ