2012-12-29 4 views
7

Tôi vừa mới bắt đầu làm việc trên ứng dụng dựa trên express.js, cũng sử dụng mô-đun pg (https://github.com/brianc/node-postgres)Xử lý lỗi tập trung trong ứng dụng dựa trên express.js

Tôi cũng đã dành một khoảng thời gian đáng kể, đọc về xử lý lỗi nút và phương pháp tiếp cận nhanh, lợi ích của việc thiết kế phần mềm trung gian đúng cách, v.v. Tuy nhiên, một vấn đề lặp lại vẫn làm tôi bực mình mà không cần giải pháp.

Nói, tôi có phương pháp định tuyến sau:

app.get("/:someThing/:someId", function(req, res, next) { 
    pgClient.query("some SQL query", function(err, data) { 
    if (err) { return next(err); } // some 500 handler will take it 
    if (data.rows.length == 0) { 
     next(); // send it over to a 404 handler 
    } 

    //finally, here we get the chance to do something with the data. 
    //and send it over via res.json or something else 
    }); 
}); 

Nếu tôi đã đọc một cách chính xác, đây sẽ là cách thích hợp để làm điều đó. Tuy nhiên, tôi đặt cược bạn cũng có thể thừa nhận rằng nó là quá nhiều của boilerplate để viết lại hơn và hơn ... và hơn nữa, ngay cả trong cùng một phương pháp router, trong trường hợp chúng tôi có nhiều callbacks lồng nhau.

Tôi đã tự hỏi bản thân cách tốt nhất để xử lý tình huống như thế nào là tập trung. Tất cả ý tưởng của tôi liên quan đến việc chặn phương thức pgClient.query. Trong một, phương pháp truy vấn sẽ chỉ đơn giản là ném lỗi thay vì chuyển nó đến cuộc gọi lại. Trong một lệnh khác, lệnh gọi đến pgClient.query sẽ gửi phương thức của router bên cạnh pgClient. Sau đó, phương thức truy vấn bị chặn sẽ biết cách đối phó với lần tiếp theo được truyền cho nó.

Từ những gì tôi biết, việc ném lỗi xung quanh không thực sự là cách thích hợp để đưa nó đến 500 trình xử lý. Mặt khác, passin tiếp theo như là một tùy chọn để pgClient, cung cấp cho một mức độ thấp rất nhiều kiến ​​thức về các lớp trên, mà dựa trên kiến ​​thức và kinh nghiệm của tôi, có thể dẫn đến khớp nối, và cũng không tốt lắm.

Bạn đề xuất điều gì?

+0

'/: một cái gì đó /: someId'? –

+0

có, tôi đã đổi số – user1219569

+0

không, tôi đã nghĩ về một tuyến đường cho tất cả 500 yêu cầu. –

Trả lời

11

Bạn có thể sử dụng phần mềm trung gian connect-domain. Nó hoạt động với connectexpress và dựa trên API Doman.

Bạn cần thêm connect-domain phần mềm trung gian làm phần mềm trung gian đầu tiên trong ngăn xếp. Đó là tất cả. Bây giờ bạn có thể ném lỗi ở khắp mọi nơi trong mã async của bạn và chúng sẽ được xử lý với phần mềm trung gian miền và được chuyển tới trình xử lý lỗi nhanh.

đơn giản ví dụ:

// Some async function that can throw error 
var asyncFunction = function(callback) { 
    process.nextTick(function() { 
     if (Math.random() > 0.5) { 
      throw new Error('Some error'); 
     } 
     callback(); 
    }); 
}; 

var express = require('express'); 
var connectDomain = require('connect-domain'); 

var app = express(); 
app.use(connectDomain()); 
// We need to add router middleware before custom error handler 
app.use(app.router); 

// Common error handler (all errors will be passed here) 
app.use(function(err, req, res, next){ 
    console.error(err.stack); 
    res.send(500, 'Something broke!'); 
}); 

app.listen(3131); 

// Simple route 
app.get('/', function(req, res, next) { 
    asyncFunction(function() { 
     res.send(200, 'OK'); 
    }); 
});