2012-12-03 26 views
5

Có cách nào để chèn phần mềm trung gian trong ngăn xếp Express không? Ý tôi là tôi muốn thiết lập app.js của tôi thành chuỗi trung gian chính và sau đó gọi các mô-đun khác truyền phiên bản ứng dụng và họ có thể chèn thêm phần mềm trung gian hơn (ví dụ: mô-đun xác thực muốn thêm hộ chiếu vào đúng địa điểm)Bạn có thể chèn phần mềm trung gian vào ứng dụng Node.JS Express

Trả lời

9

Bạn chắc chắn có thể vượt qua đối tượng app của bạn đến các module khác và gọi use đó. Tất nhiên, các hàm trung gian được thực thi theo thứ tự chúng được thêm, vì vậy bạn phải cẩn thận để đảm bảo rằng bạn gọi use theo đúng thứ tự.

app.js

var app = express(); 
// ... 

app.use(express.logger()); // first middleware function 

var someOtherModule = require('./mod.js'); 
someOtherModule.init(app); 

app.use(express.static()); // last middleware function) 

mod.js

exports.init = function(app) { 
    app.use(function(req, res, next) { 

    }); 
}; 

Theo như thực sự tiêm một chức năng trung gian ở giữa của ngăn xếp (sau khi bạn đã gọi app.use với một tập hợp các chức năng phần mềm trung gian), không có cách nào được ghi lại để làm điều đó. use chỉ thêm chức năng vào cuối ngăn xếp.

use là thực sự được cung cấp bởi Connect trong proto.js:

app.use = function(route, fn){ 

    ... 

    this.stack.push({ route: route, handle: fn }); 

    return this; 
}; 

Về mặt kỹ thuật, bạn có thể fiddle với app.stack chính mình, nhưng tôi sẽ không làm này. Bạn sẽ rối tung với một chi tiết triển khai không có giấy tờ, có trách nhiệm thay đổi. Nói cách khác, có thể cập nhật trong tương lai thành hoặc Kết nối hoặc Express có thể phá vỡ ứng dụng của bạn.

+0

Cảm ơn - Tôi không nghĩ rằng có một cách (không thể nghĩ ra một cách dễ dàng để nói nó sẽ được đặt ở đâu).Tôi có thể sẽ đi với cách bạn đề xuất lên phía trước. – MrPurpleStreak

+0

chiến thắng lớn cho thấy rằng thứ tự là quan trọng! Cảm ơn! – JWally

0

Tôi không hiểu vấn đề là gì?

Bạn có thể thêm bất kỳ chức năng trong middleware:

app.use(function(req,res,next){ 
    //some munipulation with req and res 
    next() 
}) 

Và bạn có thể gửi app này vào bạn đang moduls

+1

Tôi nghĩ vấn đề là 'app.use' luôn thêm chức năng phần mềm trung gian của bạn * vào cuối * của ngăn xếp, vì vậy phần mềm trung gian được thêm vào trước đó có thể hoàn thành yêu cầu trước khi bạn có cơ hội chạy. – josh3736

+0

Ví dụ? Khi nào nó cần? –

+0

Để thử và giữ mọi thứ thêm mô-đun - vì vậy tôi muốn mọi thứ cần làm với xác thực trong authenticate.js - nó tạo đối tượng hộ chiếu bên trong đó thay vì truyền nó ra tôi muốn chuyển ứng dụng vào và ket mô-đun đó thêm hộ chiếu. initialize và passport.session middleware ngay sau khi express.session nhưng trước router – MrPurpleStreak

1

Bạn có thể sử dụng app.use (fn) hoặc ngăn xếp chúng như thế này:

app.get('/foo', fn1, fn2, fn3); 

Chữ ký phải luôn luôn giống nhau và gọi tiếp theo();

function(req, res, next) { 
    next(); 
} 
Các vấn đề liên quan