2014-01-31 7 views
1

Мне любопытно узнать о NodeJS и Express. Как работает промежуточное программное обеспечение? Как мне создать собственное промежуточное ПО?Как работает Middleware на самом деле?

Означает ли он зависимость от инъекции зависимостей? Насколько я понимаю, вы добавляете промежуточное программное обеспечение в том порядке, в котором хотите его выполнить, и HTTP-запрос/ответ будет передаваться промежуточному программному обеспечению, а затем следующему и следующему, пока один из них не вернет/не отобразит запрос/ответ.

Проводятся ли объекты запроса и ответа через каждое промежуточное программное обеспечение по ссылке?

Извините, если это звучит запутанно. Я пытаюсь узнать, как создать свое собственное промежуточное ПО, чтобы лучше понять его в целом.

+1

Вам будет лучше искать форум или какой-либо другой сайт, на котором будут обсуждаться обсуждения. Stack Overflow не для того, чтобы задавать открытые вопросы, он задает конкретные вопросы о проблемах, с которыми вы сталкиваетесь, где эти проблемы обычно могут быть решены с помощью одного ответа без диалога назад и вперед. – mah

+0

Проще говоря, промежуточное ПО - это функции, которые обрабатывают запросы. Когда вы создаете HTTP-сервер с узлом, он может иметь стек промежуточного программного обеспечения, связанного с ним. Когда приходит запрос, он передается первой функции промежуточного программного обеспечения вместе с обернутым объектом ServerResponse и обратным вызовом 'next()'. Каждое промежуточное программное обеспечение может решить ответить, вызвав методы объекта ответа и/или передать запрос на следующий уровень в стеке, вызвав 'next()'. – adeneo

+0

Возможный дубликат [Что означает промежуточное ПО и app.use в Expressjs?] (Http://stackoverflow.com/questions/7337572/what-does-middleware-and-app-use-actually-mean-in-expressjs) – JohnnyHK

ответ

3

Edit: Это сообщение было написано для экспресс 3. Мелкие детали изменились с тех пор, но это концептуально то же самое.

Замечание перед тем, как я начну: Экспресс построен на вершине Connect, который в основном обрабатывает его промежуточное ПО. Когда я пишу express в этих примерах, я бы так же легко смог написать connect.

На нижнем уровне у вас есть HTTP-сервер узла Node. Это выглядит вроде как это:

var http = require("http"); 
http.createServer(function(request, response) { 
    response.end("Hello world!\n"); 
}).listen(1337, "localhost"); 

В принципе, вы делаете единственной функции, которая обрабатывает всех HTTP-запросы. Попробуйте использовать приведенный выше код и посетить localhost: 1337/hello или localhost: 1337/wow-anime. Технически, это все, что вам действительно нужно!

Но предположим, вы хотите, чтобы многие функции выполнялись каждый раз. Возможно, вы хотите добавить регистратор командной строки и, возможно, хотите сделать каждый простой текст запроса.

var http = require("http"); 
http.createServer(function(request, response) { 

    // logger 
    console.log("In comes a " + request.method + " to " + request.url); 

    // plain text 
    response.writeHead(200, { "Content-Type": "text/plain" }); 

    // send response  
    response.end("Hello world!\n"); 

}).listen(1337, "localhost"); 

В экспресс/Connect, вы можете написать вместо этого:

var express = require("express"); 
var app = express(); 
app.use(express.logger()); 
app.use(function(request, response, next) { 
    response.writeHead(200, { "Content-Type": "text/plain" }); 
    next(); 
}); 
app.use(function(request, response) { 
    response.end("Hello world!\n"); 
}); 
app.listen(1337); 

Я думаю, как промежуточное программное список функций. Когда приходит HTTP-запрос, мы начинаем вверху и просматриваем каждое промежуточное ПО сверху вниз, и мы останавливаемся при вызове response.end (или response.send в экспресс).

Я написал a blog post that explains Express and middleware более подробно, если вам интересно.

+0

Отлично Эван! Идеальный ответ. – Torra

0

Да, объект всегда передается по ссылке в Javascript.

Таким образом, в основном объекты запроса и ответа передаются первому промежуточному программному обеспечению, которое делает все, что захочет, объект запроса, если он хочет, а затем вызывает next() для запуска следующего промежуточного программного обеспечения, которому передаются объекты запроса и ответа.

Когда все промежуточное ПО вернулись, ответ отправляется сервером обратно. (Он может быть отправлен ранее вручную.)

Если промежуточное программное обеспечение не вызывает next(), оно возвращается, например, если вы ставите свое промежуточное программное обеспечение, обслуживающее статические файлы, перед более сложными, оно будет возвращать статические файлы без других посредников нужно было назвать.

Ваш обработчик запросов app.get('/index', function(req, res) { /* whatever you want */ }); сам по себе является промежуточным программным обеспечением.

См, например, источник (внизу страницы) от регистратора промежуточного слоя от подключения: http://www.senchalabs.org/connect/logger.html

Смежные вопросы