我使用Restify和Restify库中的某个地方,由于用户端的一些错误输入而引发异常。我在下面有一些简化的代码可以重现这个问题。下面的示例中的问题是在尝试执行doesntexist.nofunction的异步函数中。发生的事情是抛出一个异常然后被捕获到" server.on(' uncaughtException .."函数,但"错误"对象实际上是" ; IncomingMessage"类型,而不是"错误"类型。我对此有几个问题。
1)抛出的异常应始终为"错误"如果没有,是 这是Restify中的一个错误?
2)对于同时设置回调参数的库来说,这是最佳做法吗? 一个"错误"参数如果出现错误,让客户端处理它 回调而不是库抛出异常?
var restify = require('restify');
//Test with long stack traces and without it.
//var longStackTraces = require('long-stack-traces');
const server = restify.createServer({
name: 'myapp',
version: '1.0.0'
});
server.get('/', function (req, res, next) {
try {
setTimeout(function () {
doesntexist.nofunction();
}, 200);
return next();
} catch (err) {
console.log("Caught error");
}
});
server.on('uncaughtException', function (err) {
console.log("uncaught exception1: " + err.constructor);
});
process.on('uncaughtException', function (err) {
console.log("uncaught exception2: " + err.constructor);
});
server.listen(9123, function () {
console.log('%s listening at %s', server.name, server.url);
});
测试:
curl http://localhost:9123
没有长堆栈跟踪的控制台输出:
myapp listening at http://[::]:9123
uncaught exception1: function IncomingMessage(socket) {
Stream.Readable.call(this)
...
Error: uncaught exception1
at Server.<anonymous> (/usr/apps/myapp/Temp.js:22:12)
at emitMany (events.js:132:20)
at Server.emit (events.js:201:7)
at Domain.onError (/usr/apps/myapp/node_modules/restify/lib/server.js:968:18)
at emitOne (events.js:96:13)
at Domain.emit (events.js:188:7)
at Domain._errorHandler (domain.js:97:23)
at process._fatalException (bootstrap_node.js:293:33)
没有长堆栈跟踪的控制台输出:
答案 0 :(得分:1)
err
作为第一个参数的签名。这本身并不是任何规范,而是社区规范。您的代码是这样的:
server.get('/', function (req, res, next) {
try {
setTimeout(function () {
doesntexist.nofunction();
}, 200);
return next();
} catch (err) {
console.log("Caught error");
}
});
我会像这样重写它:
server.get('/', function (req, res, next) {
setTimeout(function () {
try {
doesntexist.nofunction();
next();
} catch (err) {
next(err);
}
}, 200);
});
next
是一个节点样式的回调函数,err
作为第一个参数,就像传统一样。通过在需要时提供err
参数来利用它。