#node.js #express #middleware #express-4
#node.js #экспресс #промежуточное программное обеспечение #экспресс-4
Вопрос:
После обновления до Express 4 и удаления app.router я изо всех сил пытаюсь запустить промежуточное программное обеспечение после выполнения маршрутов.
например, следующий код правильно отвечает «привет», но никогда не вызывает настроенное промежуточное программное обеспечение
var express = require( "express" )();
express.get( "/", function( req, res ) {
res.send( "hello" );
} );
express.use( function( req, res, next ) {
console.log( "world" );
next();
} );
express.listen( 8888 );
УТОЧНЕНИЕ:
следующий код показывает «до» на консоли, но не «после»:
var express = require( "express" )();
express.use( function( req, res, next ) {
console.log( "before" );
next();
} );
express.get( "/", function( req, res ) {
res.send( "hello" );
} );
express.use( function( req, res, next ) {
console.log( "after" );
next();
} );
express.listen( 8888 );
Комментарии:
1. Работает для меня. Что у вас не работает.
2. Я никогда не вижу консоль. вывод журнала
3. Показывает для меня на node.js командная строка. У вас есть дополнительный код?
4. Нет, это все. Какую версию express вы используете? (Я на 4.4)
5. У меня 4.4.3. Попробуйте.
Ответ №1:
Правильный ответ — использовать res.on("finish", cb)
обратный вызов.
т.е.:
express.use(function(req, res, next) {
console.log("before");
res.on("finish", function() {
console.log("after");
});
next();
});
Комментарии:
1. этот парень говорит «res.once», а не «res.on» lunchbadger.com /…
2. @datdinhquoc На самом деле это не имеет значения, поскольку
res
оно не будет доступно после экспресс-обработки объекта ответа, поскольку каждый запрос вызывает создание новойreq
res
пары amp; (с помощью Express). Вы правы и обычно то, что должен делать ответственный разработчик, но в данном конкретном случае они одинаковы.3. @Catfish в этом используется
http
response
модуль node с документами node. Как вы увидите в документации express , «объект res в express является расширенной версией собственного объекта ответа узла и поддерживает все встроенные поля и методы».4. Этот метод хорош, когда люди уже создали API, не используя
next
его во всех своих маршрутах.5. Это было очень полезно. Я смог реализовать аудит, который я запускаю аудит и отправляю в sql перед маршрутом, затем после маршрута я обновляю аудит в sql с помощью res.StatusCode. Спасибо test и Николасу за повторное включение («finish», async () => {})
Ответ №2:
Что касается Express 4, функция «after» из вашего второго примера никогда не вызывается, потому что средняя функция никогда не вызывает next() .
Если вы хотите, чтобы вызывалась функция «после», вам нужно добавить и вызвать следующий обратный вызов из вашей средней функции следующим образом:
var express = require( "express" )();
express.use( function( req, res, next ) {
console.log( "before" );
next();
} );
express.get( "/", function( req, res, next ) {
res.send( "hello" );
next(); // <=== call next for following middleware
} );
express.use( function( req, res, next ) {
console.log( "after" );
next();
} );
express.listen( 8888 );
res.send()
записывает заголовки и ответ обратно клиенту.
Помните, что после res.send()
того, как оно было вызвано, вам не захочется обновлять заголовки или содержимое вашего ответа. Но вы можете выполнять другие задачи, такие как обновление базы данных или ведение журнала.
Обратите внимание, что express проверяет количество аргументов в функции промежуточного программного обеспечения и выполняет другую логику. Возьмем, к примеру, экспресс-обработчики ошибок, для которых определены 4 параметра.
подпись экспресс-обработчика ошибок:
app.use(function(err, req, res, next) {});
Вызов next для самого последнего элемента в вашей цепочке промежуточного программного обеспечения является необязательным, но, вероятно, хорошей идеей на случай, если вы когда-нибудь что-то измените.
Комментарии:
1. Теперь это правда. Большинство примеров для express показывают, что маршруты задаются с арностью 2 в функции обработки. Но это исключает возможность добавления промежуточного программного обеспечения, которое должно выполняться после обработки маршрута. Для них это кажется странным соглашением.
Ответ №3:
Вы проверили установку своей консоли.войти после следующего вызова ()?
express.use( function( req, res, next ) {
next();
console.log( "world" );
});
express.get( "/", function( req, res ) {
res.send( "hello" );
});
Комментарии:
1. Это выглядит как надежный вариант.
2. Это не будет работать правильно, если запрос выполняет что-либо асинхронное
Ответ №4:
const beforeMiddleware = function(req, res, next) {
console.log('Before middleware triggered');
next();
}
const responseHandler = function(req, res, next) {
console.log('Response handler');
res.status(200).send("Hello world");
next();
}
const afterMiddleware = function(req, res, next) {
console.log('After middleware triggered');
next();
}
app.get('/', beforeMiddleware, handler, afterMiddleware);
Ответ №5:
вы можете использовать функцию промежуточного программного обеспечения в другом файле js, и вы можете использовать функцию require. так что оно будет вызываться до и после http-запроса.
index.js:
const logger = require("./logger");
const express = require("express");
var app = express();
app.listen("3000",()=>console.log("listening on 3000..."))
app.use(logger("AppServer"));
//get expression
app.get("/", function(req,res){
console.log("res not received");
res.send("Hello World");
console.log("res received");
})
logger.js
module.exports = (applicationName) =>{
return function log(req,res,next){
console.log(applicationName " started " os.hostname);
res.on("finish",()=>{
console.log(applicationName " completed " os.hostname);
})
next();
}};
output:
AppServer started hostname-PC
res not received
res received
AppServer completed hostname-PC
Примечание: в logger.js вместо того, чтобы использовать res.on(«finish», обратный вызов), вы можете использовать req.on(«end», обратный вызов).