內作出答覆有一些與此類似:如何發送域的錯誤處理
var domain = require ("domain");
var http = require ("http");
var d = domain.create();
d.on ("error", function (error){
console.error (error);
//res.writeHead (500)
//res.end()
});
d.run (function(){
http.createServer (function (req, res){
null.error
}).listen (1337, "localhost");
});
我所有的服務器域內運行。如果在請求過程中發生錯誤,我想向用戶發送500錯誤,但在錯誤處理程序中,我無法訪問響應對象。
我第一次嘗試是使用一個明確的域名爲每個請求的文檔說:
var d = domain.create();
d.on ("error", function (error){
//res.writeHead (500);
//res.end()
console.error (error);
});
d.run (function(){
http.createServer (function (req, res){
var dreq = domain.create();
dreq.add (req)
dreq.add (res)
dreq.on ("error", function (error){
res.writeHead (500);
res.end()
console.error (error);
});
null.error
}).listen (1337, "localhost");
});
的dreq
錯誤處理程序不會被調用,因爲req
和res
絕不會發出,在執行中發生錯誤這是一個TypeError。
我的第二個嘗試是使用封閉件保存到res
對象的引用,例如事件發射器:
var domain = require ("domain");
var http = require ("http");
var events = require ("events");
var emitter = new events.EventEmitter();
var d = domain.create();
d.on ("error", function (error){
emitter.emit ("error", error);
});
d.run (function(){
http.createServer (function (req, res){
emitter.once ("error", function (error){
res.writeHead (500);
res.end();
console.error (error);
});
null.error
}).listen (1337, "localhost");
});
這工作,錯誤被釣到的錯誤處理程序,然後發射所以我可以使用響應對象向用戶發送消息。如果您對node.js基礎知識知之甚少,則會看到此解決方法完全被竊聽。如果事件循環中有5個用戶請求,並且其中的1個請求發出錯誤,則發射器將執行所有錯誤處理程序,並且只有其中一個應收到500個錯誤錯誤。
我最後的嘗試是爲每個請求創建子上下文。文檔沒有提到這種模式。這對我有點困惑:
爲了防止過多的內存使用情況,域對象本身並不隱式添加爲活動域的子項。如果是的話,那麼阻止請求和響應對象被正確地垃圾收集就太容易了。
如果要將域對象嵌套爲父域的子對象,則必須明確地添加它們,然後再處置它們。
var domain = require ("domain");
var http = require ("http");
var d = domain.create();
d.on ("error", function (error){
console.error (error);
});
d.run (function(){
http.createServer (function (req, res){
var dreq = domain.create();
dreq.on ("error", function (error){
res.writeHead (500);
res.end()
console.error (error);
dreq.dispose();
});
dreq.run (function(){
null.error
//...
//dreq.dispose();
});
}).listen (1337, "localhost");
});
上午我介紹內存泄漏?
的簡單的解決方案將是,以一個唯一的ID分配給每個請求,並將它們保存在一個對象或一個數組,並且當發射器發射發現必須執行給定的唯一ID的處理程序。完全不能接受。
如果我不能保存到res
對象的引用,我怎麼能發送錯誤域錯誤處理程序中的用戶?
加上'DREQ = NULL;'dreq.dispose後'(); '?! – xrDDDD 2013-07-05 17:28:28