Middleware¶
Node.js middleware, или по-другому функция промежуточной обработки, используется для выполнения каких-либо действий на основе данных объекта запроса и ответа и передает обработку следующей функции.
Пример Node.js middleware.
app.js
const express = require('express')
const app = express()
const host = '127.0.0.1'
const port = 7000
app.use((req, res, next) => {
req.headers['From-Middleware'] = 1
console.log('Node.js Middleware')
next()
})
app.get('/', (req, res) => {
console.log(req.headers['From-Middleware'])
res.send('Home page')
})
app.listen(port, host, () =>
console.log(`Server listens http://${host}:${port}`)
)
Здесь для всех поступающих запросов добавляется HTTP-заголовок From-Middleware
со значением 1
.
Для создания Node.js middleware используется метод use()
экземпляра фреймворка Express, который принимает два аргумента:
- определение маршрута, при обращении к которому должна вызываться функция промежуточной обработки (по умолчанию
/
); - callback-функция, определяющая выполняемые действия.
Если методу use()
передать только callback-функцию, то в качестве маршрута будет использовано значение по умолчанию. Самой функции передается четыре параметра:
- ошибка, если все успешно, то содержит
null
; - объект запроса;
- объект ответа;
- следующая функция обработки.
Если не передать вызов следующему обработчику, запрос "застрянет" в текущем middleware, поэтому очень важно не забывать next()
.
app.use((req, res, next) => {
req.headers['From-Middleware'] = 1
console.log('Node js Middleware')
next() //Если не вызвать - запрос дальше не пойдет
})
Наглядным примером встроенного Node.js middleware является обработка отдачи статических файлов.
Все конечные обработчики, имеются в виду методы get()
, post()
и т. д., также являются функциями промежуточной обработки, которые не передают вызов дальше. Поэтому очень важно определить все Node.js middleware до определения конечных обработчиков.
app.get('/', (req, res) => {
console.log(req.headers['From-Middleware'])
res.send('Home page')
})
//Запрос сюда никогда не попадет
app.use((req, res, next) => {
req.headers['From-Middleware'] = 1
console.log('Node js Middleware')
next()
})