我目前工作的一个应用程序的Node.js和我在平时的异步代码的问题。
我执行节点上的HTTP模块之上的业务服务器。
该服务器支持(快递等)的路线。 例如,我有一些代码,看起来像这样:
server.any("/someRoute",function(req,resp){
resp.end("this text is sent to clients via http")
});
服务器需要能够承受失败的,我不想崩溃整个服务器时,有在传递到任何一个功能相关的问题。 当我写的代码看起来像发生的问题:
server.any("/someRoute",function(req,resp){
setTimeout(function(){
throw new Error("This won't get caught");
},100);
});
我不明白我怎么可能可以在这里捕获的错误。 我不想在一个服务器端故障导致服务器崩溃,而不是我要服务500。
唯一的解决方案,我已经能够拿出真不表现。 我只是想出了使用process.on("uncaughtException",callback)
和使用节点0.8类似的代码Domains
(这是一个局部的补救办法,但域是目前车和这仍然不是非常有表现,因为我最终不得不创建每一个手柄域)。
我想做到的是结合throw
从功能到一个范围的行动,理想的解决方案是一样的东西从功能结合所有引发的错误,以一个特定的处理函数。
这可能吗? 什么是在这种情况下处理错误的最佳做法?
我想强调的是,它应该能够继续不好的请求后,服务请求,并重新启动服务器上的每个请求或为每个处理器创建的域和捕捉他们捕获的异常似乎是一个坏主意给我。 此外-我听到的承诺也许能帮助我(有关的东西throw
在承诺),可以帮助许诺我在这种情况呢?
警告 :使用域我不会推荐原创答案,域正在在未来过时了,我有很多的乐趣写原来的答案,但我不再相信这是太重要。 相反 - 我建议使用事件发射器和具有更好的错误处理的承诺 - 在这里是下面的例子与承诺来代替。 这里使用的承诺是蓝鸟 :
Promise.try(function(){
throw new Error("Something");
}).catch(function(err){
console.log(err.message); // logs "Something"
});
随着超时(注意,我们必须返回Promise.delay):
Promise.try(function() {
return Promise.delay(1000).then(function(){
throw new Error("something");
});
}).catch(function(err){
console.log("caught "+err.message);
});
与一般的NodeJS功能可按:
var fs = Promise.promisifyAll("fs"); // creates readFileAsync that returns promise
fs.readFileAsync("myfile.txt").then(function(content){
console.log(content.toString()); // logs the file's contents
// can throw here and it'll catch it
}).catch(function(err){
console.log(err); // log any error from the `then` or the readFile operation
});
这种方法既快速又安全的捕捞,我推荐它,它使用的是很可能不是这里停留域下面的回答以上。
我结束了使用领域,我已创建以下文件我叫mistake.js
它包含以下代码:
var domain=require("domain");
module.exports = function(func){
var dom = domain.create();
return { "catch" :function(errHandle){
var args = arguments;
dom.on("error",function(err){
return errHandle(err);
}).run(function(){
func.call(null, args);
});
return this;
};
};
下面是一些例子用法:
var atry = require("./mistake.js");
atry(function() {
setTimeout(function(){
throw "something";
},1000);
}).catch(function(err){
console.log("caught "+err);
});
它也可以像正常的渔获量同步码
atry(function() {
throw "something";
}).catch(function(err){
console.log("caught "+err);
});
我希望在解决一些反馈
在一个侧面说明,以V 0.8显然,当你赶上它仍然泡到域异常process.on("uncaughtException")
我处理这在我的process.on("uncaughtException")
与
if (typeof e !== "object" || !e["domain_thrown"]) {
然而,该文件建议对process.on("uncaughtException")
的任何方式