2016-01-31 18 views
7

Tôi đang tạo trang web mẫu bằng Express và tôi đã đạt được điều gì đó mà tôi không hiểu rõ.
(Các) phần mềm trung gian xử lý lỗi phải là (các) phần tử cuối cùng trong đường ống, nếu tôi hiểu chính xác. Ví dụ, làm việc tốt:Phần mềm trung gian xử lý lỗi không phải lúc nào cũng hoạt động

var http = require('http'); 
var express = require('express'); 

var app = express(); 
app.set('view engine', 'jade'); 
app.set('views', './views'); 

app.use(express.static('./public')); 
http.createServer(app).listen(portNumber, function() { }); 

app.get('/hello', function(req, res) { 
    res.send('Welcome!'); 
}); 

app.use(function(err, req, res, next) { 
    res.status(500).send('something broke!'); 
}); 

app.get('/error', function(req, res, next) { 
    somethingNonExistent(2016); 
}); 

Tuy nhiên, nếu tôi đăng ký middleware rằng trước khi http.createServer cuộc gọi, nhưng sau khi tất cả middlewares khác đã được đăng ký, nó sẽ không làm việc - mã của tôi không được gọi:

var http = require('http'); 
var express = require('express'); 

var app = express(); 

app.use(express.static('./public')); 

app.use(function(err, req, res, next) { 
    res.status(500).send('something broke!'); 
}); 

http.createServer(app).listen(portNumber, function() { }); 

app.get('/hello', function(req, res) { 
    res.send('Welcome!'); 
}); 

app.get('/error', function(req, res, next) { 
    somethingNonExistent(2016); 
}); 

Tôi đã bỏ lỡ điều gì ở đây? Đoán của tôi là app.get cuộc gọi sử dụng một số middleware nội bộ và nó bị rối tung lên.
Tôi sử dụng Express 3.2.6 và Node.js 0.10.29, nếu điều đó tạo ra bất kỳ sự khác biệt nào

+2

xin vui lòng bình luận về các downvotes – chester89

+0

Tôi không chắc chắn về downvotes, nhưng những gì ngăn cản tôi từ bất kỳ thời gian để trả lời là mã không liên quan thêm. Cách tốt nhất để nhận câu trả lời là đăng trường hợp sử dụng đơn giản nhất mà bạn có thể đưa ra, chứ không phải đăng toàn bộ ứng dụng của bạn. Không ai thực sự thích gỡ lỗi, hãy để một mình gỡ lỗi mã của người khác. Bạn không cần bàn điều khiển đăng nhập cổng, thiết lập cấu hình môi trường, toán học để tính toán độ dài của một ngày, vv 'var app = express(); app.use (một cái gì đó); app.get ("/ hello", ...);/* nỗ lực của bạn khi xử lý lỗi */' – cdbajorin

+0

@cdbajorin được thực hiện. Tôi sẽ cập nhật bài đăng – chester89

Trả lời

3

Khi bạn xác định tuyến đường/phần mềm trung gian, path bạn chỉ định được sử dụng để xem nó có khớp với yêu cầu gửi đến không. Yêu cầu của bạn sẽ luôn được chuyển đến trận đấu đầu tiên. Yêu cầu có thể có nhiều kết quả phù hợp, do đó, đặt hàng các vấn đề ở đây. Bạn có thể nhấn tuyến đường/phần mềm trung gian phù hợp tiếp theo bằng cách gọi hàm next().

Khi bạn gắn phần mềm trung gian bằng cách sử dụng app.use mà không chỉ định đường dẫn, mọi đường dẫn đều đủ điều kiện để truy cập phần mềm trung gian đó. Vì vậy, nếu đó là điều đầu tiên bạn gắn kết, mọi yêu cầu sẽ sử dụng phần mềm trung gian đó.

Nếu bạn muốn nắm bắt tất cả các trình xử lý lỗi, bạn sẽ muốn điều ngược lại - bạn nên gắn phần mềm trung gian vào cuối các định nghĩa tuyến đường của mình. Bạn sẽ cần phải gọi next chức năng trong xử lý của bạn để thực sự đạt middleware này:

app.get('/hello', function(req, res, next) { 
    ... 
    // Let's pretend that there was some error 
    next() 
}); 

// After all of your route definitions... 
app.use(function(req, res) { 
    res.status(500).send('something broke!'); 
}) 

Lưu ý rằng nếu không tồn tại đường đi cho con đường hiện tại, bạn cũng sẽ đánh bắt này tất cả các middleware.

+0

đang mong đợi một cái gì đó như thế này. Cảm ơn – chester89

+0

cũng có, tôi nghi ngờ câu trả lời của bạn áp dụng cho cả hai phiên bản 3 và 4? chỉ tò mò – chester89

+0

Có, điều này làm việc cho các phiên bản 3 và 4. – Wex

-1

Documents

http://expressjs.com/en/guide/error-handling.html

Bạn xác định lỗi xử lý trung gian cuối cùng, sau khi app.use khác() và tuyến gọi; ví dụ:

var bodyParser = require('body-parser'); 
var methodOverride = require('method-override'); 

app.use(bodyParser()); 
app.use(methodOverride()); 
app.use(function(err, req, res, next) { 
    // logic 
}); 

Các nội

Để dễ hiểu, bạn có thể tưởng tượng các đường ống dẫn. Khi điều khiển của bạn nhận được yêu cầu, bên trong Express, nó trông như thế này

try { 
    fn(req, res, next); // your controller 
} catch (err) { 
    next(err); 
} 

Vì vậy, sau đó mã lỗi ném của bạn, nó sẽ gọi next với err. Về cơ bản, nó giống như gọi next(new Error()). Sau đó, hãy cố gắng tìm phần mềm trung gian tiếp theo với 4 đối số trong đường ống trung gian. Trong trình xử lý lỗi tình huống của bạn được khai báo trước bộ điều khiển bóng mờ của bạn, vì vậy anh ấy không liên quan.

Về mặt kỹ thuật, không có sự khác biệt giữa bộ điều khiển và phần giữa. Tùy chọn, bạn có thể vượt qua trong bộ điều khiển tham số next và gọi nó để đi qua đường ống tiếp theo.Nếu bạn không gọi next(), bạn sẽ xử lý xong yêu cầu.

+0

cách đoạn mã đầu tiên hoạt động, trong trường hợp đó? – chester89

+0

nó không hoạt động với Express @ 4 –

Các vấn đề liên quan