2012-11-10 19 views
11

Uygulamanızda Node.js ve Express var. Bunun için testler yazmam gerek. Express uygulama hatalarını ele alma konusunda bir sorunum var. Bu How do I catch node.js/express server errors like EADDRINUSE?'u buldum, ama benim için çalışmıyor, nedenini bilmiyorum. Ben expressApp.listen() yürütülürken (EADDRINUSE, EACCES vb) gerçekleşebilir hataları işlemek istiyorum.Node.js Express uygulama tanıtımı başlatma hatası

express = require('express') 
listener = express() 

#doesn't work for me 
listener.on('uncaughtException', (err) -> 
    #do something 
) 

#doesn't work too 
listener.on("error", (err) -> 
    #do something 
) 

#this works, but it caughts all errors in process, I want only in listener 
process.on('uncaughtException', (err) -> 
    #do something 
) 

listener.listen(80) #for example 80 to get error 

Herhangi bir fikir?

+0

'listener.on 'hatası' ...' çalışması gerekir:

listener.listen aslında ne yapar
listener.listen(80).on('error', function(err) { }); 

HTTP sunucusu oluşturmak ve üzerinde dinleme çağrı olduğunu. Bu hat olsa bile normal yığın izini ve çökmesini yapar mı? – loganfsmyth

+0

Evet, bunu 'listener.listen (80)' yaparsam yığın yığını ve çökmeler yazdırır.'Listener.on' hatası ile bile, ... ' Belki de bu hata oluştu Express hatası değildir ve bu yüzden bu işlemez. Ama bu sadece varsayımdır. –

cevap

20

İlk kapalı, expressJS uncaughtException olayını atmaz, işlem yapar, bu nedenle kodunuzun çalışmadığı bir sürpriz değildir. Bunun yerine process.on('uncaughtException',handler) kullanın İsteğe bağlı olan,

app.configure(function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

Bu fonksiyon, istemciye bir hata mesajı gönderir:

sonra, expressJS önce olduğu gibi, bu amaç için, içerir katman işlevini kullanmaktır hata işleme standart bir yol sağlar stacktrace ve connectJS errorHandler adresinde belgelenmiştir.

(errorHandler aslında connectJS bir parçasıdır ve sadece expressJS tarafından maruz kaldığı unutmayın.)

mevcut errorHandler sağlayan davranış ihtiyaçlarınız için yeterli, kaynağı connectJS's errorHandler middleware bulunmaktadır değildir ve kolayca değiştirilebilir Eğer ihtiyaçlarınızı karşılamak için.

var myErrorHandler = function(err, req, res, next){ 
    ... 
    // note, using the typical middleware pattern, we'd call next() here, but 
    // since this handler is a "provider", i.e. it terminates the request, we 
    // do not. 
}; 

Ve yüklemek: Tabii, daha doğrusu doğrudan bu işlevi değiştirerek daha

Bunu yapmak için "doğru" yolu olduğu gibi, bir başlangıç ​​noktası olarak connectJS sürümünü kullanarak, kendi errorHandler yaratmaktır

app.configure(function(){ 
    app.use(myErrorHandler); 
}); 

iyi yazılmış öğretici için filter ve provider katman ve How To Write Middleware for Connect/Express ait connectJS fikri ile ilgili açıklama için Just Connect it, Already bakınız: olarak expressJS geri taşır.

Ayrıca, bu konuda yararlı olabilecek: Son olarak

+0

+1, çok iyi cevap! – Menztrual

+0

Çok detaylı açıklama için teşekkürler, yine de yararlı olacaktır. Web isteği işlenirken hatalarla uğraşmam gerekmiyor. Ben sunucu oluştururken ve app.listen (...) çağrısı yaparken ihtiyacım var. Şimdi anladım ki, burada Node.js hata işleme, Express'te middleware değil, gereklidir. process.on ('uncaughtException', handler) davamda kabul edilebilir. –

+0

@Piane_Ramso, o zaman evet, kendi olay işleyicilerinizi process.on ('uncaughtException') 'a ekleyerek, kesinlikle gitmek için bir yoldur. Merak ediyorsanız, [node.cc] 'de (veya # 1739) numaralı satırda yer alan "yakalanmamış" istisnaları işleyen temel kod (https://github.com/joyent/node/blob/master/src/ node.cc) –

57
bulunabilir

Bu hile yapmak gerekir:

app.listen = function(){ 
    var server = http.createServer(this); 
    return server.listen.apply(server, arguments); 
}; 
+10

Bu en basit ve doğru cevap, ve hiçbir upvotes yoktur ki inanılmaz! Hile, webServer nesnesinin app.listen tarafından döndürüldüğünü anlamaktır. Bunu kullanıyorum: '' '' '' ''. App.... (80, function() { console.log ('başarı'); }). On ('error', işlev (err) { if (err.errno === 'EADDRINUSE') { console.log ('bağlantı noktası meşgul'); console.log (err); } }); '' ' –

+0

Kodunuzun yaptığını anlamıyorum. Eğer app.listen node çağırıyorsanız zaten zaten bir head.listen() yöntemini geçersiz kıldığını ve orada kendi kodunuzla geçersiz kıldığını düşündüğüm bir kaputun altında bir http.createServer var mı? – PositiveGuy

+0

İlk kod satırı ne kullanılmalı, diğer her şey bunun neden işlediğinin açıklamasıdır. –

İlgili konular