抛出的JavaScriptexception不是types“错误”

我使用Restify和Restify库中的某个地方,由于用户端的一些错误input而抛出exception。 我在下面有一些简化的代码,重现了这个问题。 在下面的例子中的问题是在一个asynchronous函数,试图执行doesntexist.nofunction。 会发生什么是抛出exception,然后捕获“server.on('uncaughtException ..”函数,但“err”对象实际上是一个“IncomingMessage”types,而不是“错误”types。我有几个问题对这个。

1)应抛出的exception总是types“错误”,如果不是,这是一个在Restify中的错误?

2)如果存在错误,那么采用callback参数设置“err”参数的库是否是一个最佳实践,让客户端在callback中处理它,而不是抛出exception?

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); }); 

testing:

 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) 

控制台输出没有长堆栈跟踪:

  1. 节点样式的callback函数应该有一个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作为第一个参数的节点式callback。 通过在需要时提供err参数来使用它。