2012-06-30 39 views
9

Tôi đang học express.js/node.js và có hiểu biết tốt nhưng không tuyệt vời về mô hình nguyên mẫu javascript. Do đó, tôi hơi bối rối về cách thức phần mềm trung gian có thể được xếp chồng lên nhau trong các cơ chế định tuyến của express.js.Phạm vi chức năng phần mềm trung gian trong express.js

Nói rằng chúng tôi có điều này code

function andRestrictTo(role) { 
    return function(req, res, next) { 
     req.authenticatedUser.role == role 
      ? next() : next(new Error('Unauthorized')); 
    } 
} 

app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){ 
    res.send('Deleted user ' + req.user.name); 
}); 

Kể từ andRestrictTo (vai trò) trả về một middleware, nó lấy của thực hiện trong chuỗi định tuyến - Tôi đã nhận đó. Tuy nhiên:

  1. Thông số tiếp theo, tham số tiếp theo đến từ đâu trong hàm trả về? Tôi đoán rằng "chuỗi" bằng cách nào đó xếp hàng và xác định các thông số, nhưng điều này hơi mơ hồ để hiểu sâu hơn ...

  2. Điều gì đang xảy ra với Lỗi được nêu lên như tham số tiếp theo? Có lỗi nào đơn giản là phá vỡ chuỗi phần mềm trung gian không?

  3. Nếu tôi muốn đóng gói cơ chế hạn chế cho một tệp/mô-đun riêng biệt (như khuôn khổ bảo mật), cách thực hiện?

Nó sẽ là tuyệt vời nếu ai đó có thể chỉ ra những ý tưởng cơ bản :)

Trả lời

9

1) reqres xuất phát từ chính nguồn Express JS, tức là xử lý Node.JS http.createServer (cả hai biến được sửa đổi một chút trước khi thực sự nhấn trình xử lý Express '). Tại thời điểm đó, Express nắm giữ tất cả các tuyến đường và áp dụng các hàm req, resnext cho mỗi tuyến đường. next chức năng biết tại đó phần mềm trung gian chúng tôi đang ở thời điểm này (do một số thủ đoạn phạm vi) và gọi nó như thế này: next() sẽ đưa bạn đến trình xử lý tiếp theo.

2) Khi lỗi được nâng lên (trên thực tế không nâng, nhưng truyền cho), các next chức năng sẽ đưa bạn đến xử lý lỗi, mà bạn có thể xác định bằng error phương pháp app, ví dụ (lấy từ Express documentation) :

app.error(function(err, req, res, next){ 
    if (err instanceof NotFound) { 
     res.render('404.jade'); 
    } else { 
     next(err); 
    } 
}); 

Nâng error breakes một chuỗi các middlewares và sẽ đưa bạn đến chuỗi các xử lý lỗi (như bạn có thể thấy, bạn sử dụng next trong xử lý lỗi cũng).

3) Không khó khăn ở tất cả:

security.js

module.exports = function(req, res, next) { 
    console.log('Security middleware!'); 
    next(); 
} 

app.js

app.get('/', require('./security'), ...); 
1

1) Express (trên thực tế) định tuyến đang Connect mất một yêu cầu HTTP và bắt đầu đi qua nó cùng với tất cả các chức năng trung gian, gọi mỗi người trong số họ có reqres đi kèm với yêu cầu và thêm next gọi phần mã định tuyến chuyển quyền kiểm soát cùng với chức năng phần mềm trung gian tiếp theo trong chuỗi.

2) Không có lỗi nào được nêu ra (chỉ một tuyên bố throw thực sự có thể gây ra lỗi). Mã định tuyến nhận ra rằng một hàm trung gian đã trả về một đối tượng Error và xử lý nó một cách thích hợp.

3) Bạn muốn chỉ cần đặt nó vào một mô-đun đó xuất khẩu andRestrict (nếu nó là chức năng duy nhất bên ngoài sử dụng được trong các mô-đun, bạn nên đặt exports=andRestrict và sau đó gọi nó với require('mymodule')); nếu không bạn sẽ đặt exports.andRestrict=<body of your function> và gọi theo hai bước: mymodule=require('mymodule') sớm và sau đó mymodule.andRestrict (ví dụ: khi chuyển nó làm phần mềm trung gian)).

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