Express sudah memiliki implementasi penanganan kesalahan. Ini mewarisinya dari connect. Untuk menggunakannya, Anda perlu menambahkannya sebagai titik middleware terakhir (panggilan app.use(...) terakhir). Misalnya:
var express = require('express')
, app = express();
app.use(app.router);
app.use(express.errorHandler());
// app.get(...), app.post(...), app.listen(...), etc.
Jika Anda ingin menangani semua kesalahan dengan kode respons 500 sederhana, Anda dapat mengganti express.errorHandler()
dengan fungsi Anda sendiri. Dalam hal ini kode Anda akan terlihat seperti:
var express = require('express')
, app = express();
app.use(app.router);
app.use(function(err, req, res, next){
if (!err) return next();
res.send(500);
});
// app.get(...), app.post(...), app.listen(...), etc.
Informasi selengkapnya tentang cara tersebut dapat ditemukan di contoh kesalahan ekspres komentar dalam kode
PEMBARUAN:
Tentu saja Anda bisa menggunakan domain untuk setiap permintaan. Anda dapat membungkus setiap permintaan secara terpisah atau menggunakan pembungkus router untuk menangani SEMUA pengecualian. Kode berikut:
var express = require('express')
, http = require('http')
, app = express()
, domain = require('domain');
//app.use(app.router);
app.use(function(req, res, next){
var d = domain.create();
d.on('error', function(er) {
console.log('error, but oh well', er.message);
res.send(500);
});
// explicitly add req and res
d.add(req);
d.add(res);
d.run(function() {
app.router(req, res, next);
});
});
app.get('/', function(req,res){
process.nextTick(function(){
throw new Error('Check Error');
});
});
http.createServer(app).listen(3000, function(){
console.log('Express server listening on port 3000');
});
!!TAPI!! jangan pernah menggunakan ini dalam produksi. Alasannya adalah cara kerja JS throw. Pasti akan menjadi penyebab bocornya aplikasi kamu dan membuatnya semakin tidak stabil. Anda dapat menggunakan penanganan kesalahan tersebut untuk menerapkan algoritme pematian khusus (misalnya untuk menutup koneksi yang sudah terbuka). Informasi selengkapnya tentang penggunaan domain yang benar dapat ditemukan di dokumentasi.
Untuk memantau kebocoran Anda dapat menggunakan teknik dari artikel ini.
PEMBARUAN 2:
Aku tidak bisa membiarkan ini belum selesai. trycatch
kode:
var express = require('express')
, http = require('http')
, app = express()
, domain = require('domain')
, trycatch = require('trycatch');
//app.use(app.router);
app.use(function(req, res, next){
trycatch(function(){
app.router(req, res, next);
}, function(er){
console.log(er.message);
res.send(500);
});
});
app.get('/', function(req,res){
process.nextTick(function(){
throw new Error('Check Error');
});
});
http.createServer(app).listen(3000, function(){
console.log('Express server listening on port 3000');
});
Saya telah meninjau sumber trycatch
dan tidak ada keajaiban apa pun. Itu masih menjadi penyebab kebocoran. trycatch
memiliki domain
di bawah tenda.
person
andbas
schedule
30.10.2013