2013-10-10 2 views
3

Итак, я видел TJ's guide to creating modular Express-apps, после чего он был полезен, но хотел бы узнать больше о том, как он работает, однако поиск не дает мне ответов.Как работает приложение для работы в Express

Вкратце мне интересно: При установке приложений в Express, какие части приложений являются общими, а какие нет?

Некоторые примеры прояснить мой вопрос:

app.js:

app.use(express.bodyParser()); 

app.use(loginApi); //loginApi is an express app 

app.listen(3000); 

Этот пример работает. Но если я разместил app.use(loginApi) до app.use(express.bodyParser());, синтаксический анализатор тела не будет доступен в субаппале loginApi. Почему это?

Другой пример:

submodule.js

var app = module.exports = require('express')(); 
app.all('*', function(req, res, next){ 
    console.log('nifty middleware'); 
     next(); 
}); 

app.js

app.get('/funtimes', fn); 
app.use(submodule); 
app.listen(3000); 

Сейчас в этом примере, если я правильно понимаю, то /funtimes маршрут не будет зависеть от промежуточное ПО подмодуля для всех маршрутов. Но как насчет остальных маршрутов app.js? Будут ли они затронуты? И что, если я добавлю еще один модуль, это будет затронуто?

ответ

3

если я размещаю app.use (loginApi) перед app.use (express.bodyParser()); , синтаксический анализатор тела не будет доступен в subapp loginApi. Почему это?

Это связано с тем, что Express обрабатывает запросы. Любой входящий запрос начинается в верхней части стека промежуточного программного обеспечения, начиная с стека.

Промежуточное программное обеспечение - это просто функции, которые имеют подпись функции function(req, res, next), которые либо вызывают next(), если они хотят передать запрос на последующие функции, либо отправить ответ самостоятельно. Вы определяете «промежуточной цепочки» грозди этих функций (многие предоставляются курьерским, как express.logger() и express.compress().)

Таким образом, в следующем сценарии:

app.use(express.bodyParser()); 
var loginApi = require('./api/index.js') 
app.use(loginApi); 
app.use(app.router); 

то входящий запрос будет первым ударило app.use(express.bodyParser()), синтаксический анализ req.body. Затем эта функция вызывает свой внутренний next(), передавая ее следующей функции в цепочке промежуточного программного обеспечения (app.use(loginApi)). Приложение loginApi имеет собственную цепочку промежуточного программного обеспечения, но запросы уже имеют req.body, установленные из внешнего приложения. Если loginApi не отправляет ответ, запрос будет продолжаться до app.use(app.router), и в этот момент запросы перейдут к функциям маршрутизации, которые вы установили в своем внешнем приложении.

Так что ответ: Подключенное приложение будет иметь функции промежуточных разделяемые, которые расположены перед линией app.use(loginApi)

3

Промежуточное программное обеспечение работает в порядке (пока одно из посредников не позвонит next()).

Если вы use() стоечного приложения перед use() ING bodyParser весь суб-приложение будет работать, прежде чем bodyParser добавляет свои свойства.

2

Что вы спрашиваете, это промежуточное ПО. Это немного смутило меня. Средство промежуточного уровня - это функции, выполняемые для запроса запроса и ответа на него. Функция app.use() принимает функцию как единственный аргумент. Эта функция управляет запросом согласованным образом.

app.use очень похож на app.all ("*").

Порядок имеет значение. Например, вы можете запустить валидатор перед тем, как отвечать на ответ.

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

app.get("/whatever",[ 
    function(req,res,next}{ 
     ...validation... 
     next(); 
    }, 
    function(req,res) { 
     ...actions.... 
     res.send(200); 
    } 

]);

Следующий обратный вызов сообщает express для запуска следующей функции в промежуточном программном обеспечении. Middleware также может изменять объект запроса. Это много используется при аутентификации. Например, вы увидите, что req.user определяется из базы данных, поэтому в более позднем промежуточном программном обеспечении вы сможете ссылаться на свойства пользователя. Но его можно также использовать для тонны других вещей.

+0

Кстати, вы даже не нужен массив, вы можете просто передать несколько функций обработчиков 'приложениям. get ('whatever', fn1, fn2, fn3) ' – Plato

+0

Это не совсем правильно. Вы можете использовать app.use() для «монтирования» subapp в относительном каталоге. Например, 'app.use ('/ products', productService)' будет использовать промежуточное программное обеспечение 'productService'/приложение для всех путей, сопоставляющих '/ products', которые не пойманы более ранним маршрутом. –

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