Node.js 路由后的Node Express 4中间件
在升级到Express 4和删除app.router之后,我很难在路由执行之后让中间件执行 e、 g.以下代码正确响应“hello”,但从不调用已配置的中间件Node.js 路由后的Node Express 4中间件,node.js,express,middleware,express-4,Node.js,Express,Middleware,Express 4,在升级到Express 4和删除app.router之后,我很难在路由执行之后让中间件执行 e、 g.以下代码正确响应“hello”,但从不调用已配置的中间件 var express = require( "express" )(); express.get( "/", function( req, res ) { res.send( "hello" ); } ); express.use( function( req, res, next ) { console.log
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 );
澄清:
以下代码在控制台上显示“before”,但不显示“after”:
秩序很重要
是否检查了在下一次()调用后放置console.log
对于express4,第二个示例中的“after”函数从未被调用,因为中间的函数从未调用next() 如果希望调用“after”函数,则需要从中间函数添加并调用下一个回调,如下所示:
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 );
var express=require(“express”)();
express.use(函数(req、res、next){
控制台日志(“之前”);
next();
} );
express.get(“/”,函数(req,res,next){
res.send(“你好”);
next();//正确答案是使用res.on(“finish”,cb)
回调
i、 e:
您可以在不同的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”,callback),您可以使用req.on(“end”,callback)是的,但这是错误的顺序。我希望我的中间件在路由处理程序之后执行。对我有效。什么对你无效。我从未在node.js命令行上看到console.log outputShows。你有其他代码吗?没有。你运行的是什么版本的express?(我在4.4上)我的是4.4.3。试试看。这是真的。大多数express show routes的示例都是在处理函数中用2的算术数指定的。但是这样做会阻止添加中间件,而中间件应该在处理完路由后执行。这对他们来说似乎是一个奇怪的约定。我可以确认这根本不起作用reth这家伙说的是“res.once”,而不是“res.on”@datdinhqooc。其实这并不重要,因为响应对象的Express完成后,res
将不可用,因为每个请求都会导致创建一个新的req
&res
对(通过Express)。您是对的,通常是负责任的开发人员应该做的,但在这种特殊情况下,它们是相同的。@Catfish这使用了node的http
moduleresponse
功能。正如您在中所看到的,express的“res对象是node自己的response对象的增强版本,支持所有内置字段和方法。”此方法适用于在所有路由中都没有使用next
的情况下创建API的情况。它看起来像一个健壮的变体。如果请求执行任何异步操作,则此方法将无法正常工作
express.use( function( req, res, next ) {
next();
console.log( "world" );
});
express.get( "/", function( req, res ) {
res.send( "hello" );
});
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 );
express.use(function(req, res, next) {
console.log("before");
res.on("finish", function() {
console.log("after");
});
next();
});
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