Express มีการใช้งานตัวจัดการข้อผิดพลาดอยู่แล้ว โดยสืบทอดมาจาก เชื่อมต่อ หากต้องการใช้งาน คุณต้องเพิ่มเป็นจุดมิดเดิลแวร์ตัวสุดท้าย (การเรียก app.use(...) ครั้งล่าสุด) ตัวอย่างเช่น:
var express = require('express')
, app = express();
app.use(app.router);
app.use(express.errorHandler());
// app.get(...), app.post(...), app.listen(...), etc.
หากคุณต้องการจัดการกับข้อผิดพลาดทั้งหมดด้วยโค้ดตอบกลับ 500 แบบง่าย คุณสามารถแทนที่ express.errorHandler()
ด้วยฟังก์ชันของคุณเองได้ ในกรณีนี้รหัสของคุณจะมีลักษณะดังนี้:
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.
ข้อมูลเพิ่มเติมเกี่ยวกับวิธีการดังกล่าวสามารถพบได้ใน ตัวอย่างข้อผิดพลาดด่วน ความคิดเห็นในโค้ด
อัปเดต:
แน่นอนคุณสามารถใช้โดเมนสำหรับแต่ละคำขอได้ คุณสามารถล้อมแต่ละคำขอแยกกัน หรือใช้การห่อสำหรับเราเตอร์เพื่อจัดการกับข้อยกเว้นทั้งหมด รหัสดังต่อไปนี้:
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');
});
!!แต่!! ไม่เคยใช้สิ่งนี้ในการผลิต เหตุผลก็คือโดยธรรมชาติแล้ว JS ทำงานอย่างไร มันจะเป็นสาเหตุของการรั่วไหลในใบสมัครของคุณอย่างแน่นอนและทำให้ไม่เสถียรมากยิ่งขึ้น คุณสามารถใช้การจัดการข้อผิดพลาดดังกล่าวเพื่อใช้อัลกอริทึมการปิดระบบแบบกำหนดเอง (เช่น เพื่อปิดการเชื่อมต่อที่เปิดอยู่แล้ว) ข้อมูลเพิ่มเติมเกี่ยวกับการใช้โดเมนอย่างถูกต้องมีอยู่ในเอกสารประกอบ
หากต้องการตรวจสอบการรั่วไหลคุณสามารถใช้เทคนิคจาก บทความนี้
อัปเดต 2:
ฉันทิ้งเรื่องนี้ไว้ไม่เสร็จไม่ได้ trycatch
รหัส:
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');
});
ฉันได้ตรวจสอบแหล่งที่มาของ trycatch
แล้ว และไม่มีเวทย์มนตร์ใดๆ เลย มันยังคงเป็นสาเหตุของการรั่วไหล trycatch
มี domain
ซ่อนอยู่
person
andbas
schedule
30.10.2013