2013-07-19 22 views
12

Câu hỏi này kéo dài của What is Node.js' Connect, Express and "middleware"?Middleware mẫu thiết kế trong Node.js: Kết nối

Tôi đang đi con đường của học Javascript -> Node.js -> Connect -> Express -> ... để tìm hiểu về cách sử dụng ngăn xếp phát triển web hiện đại. Tôi có một nền tảng trong mạng lớp thấp, vì vậy việc bắt đầu và thực hiện với các mô-đun nethttp của Node.js thật dễ dàng. Mô hình chung của việc sử dụng một máy chủ để định tuyến các yêu cầu đến các trình xử lý khác nhau có vẻ tự nhiên và trực quan.

Chuyển sang Kết nối, tôi e rằng mình không hiểu mô hình và luồng dữ liệu chung của "phần mềm trung gian" này. Ví dụ, nếu tôi tạo một số phần mềm trung gian để sử dụng với Connect ala;

// example.js  
module.exports = function (opts) { 
    // ... 
    return function(req, res, next) { 
     // ... 
     next(); 
    }; 
}; 

và "sử dụng" nó trong Kết nối qua

var example = require('./example'); 
// ... 
var server = connect.createServer(); 
// ... 
server.use(example(some_paramater)); 

Tôi không biết khi nào middleware của tôi được gọi. Ngoài ra, nếu tôi là use() 'trong các phần mềm middlware khác, tôi có thể được đảm bảo theo thứ tự mà phần mềm trung gian được gọi không? Ví dụ, tôi theo giả định hàm next() được sử dụng để gọi tiếp theo (một lần nữa, làm thế nào để tôi thiết lập một thứ tự?) Middleware; tuy nhiên, không có tham số nào (req, res, next) được thông qua. Các thông số này có được truyền bằng cách nào đó không?

Tôi đoán rằng bộ sưu tập của module middleware sử dụng được kết hợp với nhau, bắt đầu với http callback -> do đó một loạt các tính năng bổ sung trong giữa của callback yêu cầu ban đầu và máy chủ kết thúc một câu trả lời .

Tôi đang cố gắng hiểu mô hình phần mềm trung gian và luồng thông tin/thực thi.

Bất kỳ trợ giúp nào được đánh giá cao. Cảm ơn bạn đã đọc

Trả lời

11

Phần giữa được gọi là chuỗi chức năng, với thứ tự dựa trên thứ tự xác định trung gian (thời gian) với các tuyến đường phù hợp (nếu có).
Tính đến các đối tượng reqres đang di chuyển qua chuỗi để bạn có thể sử dụng lại/cải thiện/sửa đổi dữ liệu trong chuỗi dọc theo chuỗi.

Có hai trường hợp sử dụng chung cho phần mềm trung gian: chungcụ thể.

Chung như bạn đã xác định trong ví dụ ở trên: app.use, nó sẽ áp dụng cho mọi yêu cầu duy nhất. Mỗi phần mềm trung gian phải gọi next() bên trong, nếu nó muốn tiến hành phần mềm trung gian tiếp theo.

Khi bạn sử dụng app.get('/path', function(... chức năng thực tế này là phần mềm trung gian, chỉ cần xác định nội tuyến. Vì vậy, nó là loại hoàn toàn dựa trên middlewares, và không có endware: D

Thứ tự chuỗi dựa trên thứ tự xác định. Vì vậy, điều quan trọng là xác định phần mềm trung gian theo cách đồng bộ hoặc theo cách không đồng bộ. Nếu không, thứ tự khác nhau của phần mềm trung gian có thể phá vỡ logic, khi chuỗi phần mềm trung gian phụ thuộc vào nhau.

Một số phần mềm trung gian có thể được sử dụng để phá vỡ chuỗi return next(new Error());.Nó là hữu ích cho ví dụ để xác nhận hoặc trung gian xác thực.
Một cách sử dụng hữu ích khác cho phần mềm trung gian là xử lý và phân tích cú pháp dữ liệu yêu cầu, như cookie hoặc ví dụ tốt về số app.use(express.bodyParser()); như vậy.

+0

Vì vậy, nếu tôi có 'var A = require ('./ A'), B = require ('./ B'); app.use (A()); app.use (B()); 'sau đó' A' sẽ đến trước 'B', với' A''s 'next' gọi' B'? Các thông số sau đó có được truyền ngầm không? Khác như thế nào 'B' truy cập' req, res, ect'? – gone

+0

Chính xác. Các đối tượng 'req' và' res' đang di chuyển qua và là cùng một đối tượng trong tất cả chuỗi. Vì vậy, theo cách đó bạn có thể lưu một số dữ liệu trong đó, và sau đó sử dụng lại nó sau này trong một phần mềm trung gian khác dọc theo chuỗi. Đó là chính xác những gì xảy ra với hầu hết dữ liệu của bạn trong 'req'. Ví dụ theo dữ liệu POST mặc định không được phân tích cú pháp và phần tử trung gian 'express.bodyParser()' sẽ phân tích nó, và bạn có quyền truy cập vào nó sau này trong chuỗi. – moka

+0

Tuyệt! Cảm ơn vì sự trả lời! – gone