Express 中的中间件链接
Chaining of middleware in Express
我正在编写 API,想了解添加由多个路由共享的中间件的好方法是什么。中间件在每个路由中做同样的事情,比如验证 hosts/ip、验证用户等。
req 对象与每个中间件中的其他对象一起加载,如 req.host、req.ip、req.username 等
app.post("/route1", middleware1, middleware2, middleware3, middleware4);
app.post("/route2", middleware1, middleware2, middleware3, middleware4);
const middleware1 = (req, res, next) => {
// does something to validate user
req.username = "username"
next();
}
const middleware2 = (req, res, next) => {
// host validation
req.host = "something modified in validation"
next();
}
const middleware3 = (req, res, next) => {
// checks for mac and ip
req.mac = "mac addr"
next();
}
const middleware4 = (req, res, next) => {
res.send();
}
或者像这样:
app.post("/route1", middleware1);
app.post("/route2", middleware1);
const middleware1 = (req, res) => {
// does something to validate user
req.username = "username"
middleware2(req, res);
}
const middleware2 = (req, res) => {
// host validation
req.host = "something modified in validation"
middleware3(req, res);
}
const middleware3 = (req, res) => {
// checks for mac and ip
req.mac = "mac addr"
middleware4(req, res);
}
const middleware1 = (req, res) => {
res.send();
}
谢谢。
通常我不会直接从另一个中间件调用中间件。它混合了中间件逻辑的职责和中间件的使用位置。
Express 比您想象的更易于配置。也可以在常用路径下安装常用中间件:
如果所有路由使用中间件:
// How common middlewares are normally installed:
app.post(middleware1);
app.post(middleware2);
app.post(middleware3);
app.post(middleware4);
// Alternative, less common way to do it:
app.post(middleware1,middleware2,middleware3,middleware4);
如果只有 url 的特定 模式 使用中间件:
// Use a regexp:
app.post(/route(1|2)/, middleware1, middleware2, middleware3, middleware4);
// Or if you don't like regexp, use globs:
app.post('route*', middleware1, middleware2, middleware3, middleware4);
// Or a more specific glob pattern:
app.post('route1?2?', middleware1, middleware2, middleware3, middleware4);
如果子路径中的所有 url 使用中间件。例如,假设 /route/...
中的所有 url 都使用中间件:
const route = express.Router();
app.use('/route',route);
route.post(middleware1);
route.post(middleware2);
route.post(middleware3);
route.post(middleware4);
如果上述 none 对您有吸引力,您仍然可以使用第二个选项,但不是在彼此内部调用中间件,而是编写一个中间件来初始化中间件:
function commonMiddlewares (req, res, next) {
middleware1(req,res,function() {
middleware2(req,res,function() {
middleware3(req,res,function() {
middleware4(req,res,next);
});
});
});
}
可以写成少嵌套的方式:
function commonMiddlewares (req, res, next) {
function runMiddleware4 () {
middleware4(req,res,next);
}
function runMiddleware3 () {
middleware3(req,res,runMiddleware4);
}
function runMiddleware2 () {
middleware2(req,res,runMiddleware3);
}
middleware1(req,res,runMiddleware2);
}
const express = require('express')
const { routesMiddleware } =require('./middlewares')
const { pureVaidationsFunctions1 } =require('./services')
const rout1 =express.Router()
const rout2 =express.Router()
const app = express()
app.use('/route1',route1)
app.use('/route2',route2)
// routesMiddleware a middleware to handle the execution of list of functions
// pureVaidationsFunctions1 list of funtions that `routesMiddleware` will consume
route1.post(routesMiddleware(pureVaidationsFunctions1))
route2.post(routesMiddleware(pureVaidationsFunctions2))
有道理吗?
您可以指定多个中间件,参见the app.use docs:
An array of combinations of any of the above.
您可以创建一个包含所有中间件的文件,例如 -
middlewares.js
module.exports = [
function(req, res, next){...},
function(req, res, next){...},
function(req, res, next){...},
.
.
.
function(req, res, next){...},
]
然后简单地添加它:
/*
you can pass any of the below inside app.use()
A middleware function.
A series of middleware functions (separated by commas).
An array of middleware functions.
A combination of all of the above.
*/
app.use(require('./middlewares.js'));
注意 - 仅对所有此类请求通用的中间件执行此操作。
我正在编写 API,想了解添加由多个路由共享的中间件的好方法是什么。中间件在每个路由中做同样的事情,比如验证 hosts/ip、验证用户等。 req 对象与每个中间件中的其他对象一起加载,如 req.host、req.ip、req.username 等
app.post("/route1", middleware1, middleware2, middleware3, middleware4);
app.post("/route2", middleware1, middleware2, middleware3, middleware4);
const middleware1 = (req, res, next) => {
// does something to validate user
req.username = "username"
next();
}
const middleware2 = (req, res, next) => {
// host validation
req.host = "something modified in validation"
next();
}
const middleware3 = (req, res, next) => {
// checks for mac and ip
req.mac = "mac addr"
next();
}
const middleware4 = (req, res, next) => {
res.send();
}
或者像这样:
app.post("/route1", middleware1);
app.post("/route2", middleware1);
const middleware1 = (req, res) => {
// does something to validate user
req.username = "username"
middleware2(req, res);
}
const middleware2 = (req, res) => {
// host validation
req.host = "something modified in validation"
middleware3(req, res);
}
const middleware3 = (req, res) => {
// checks for mac and ip
req.mac = "mac addr"
middleware4(req, res);
}
const middleware1 = (req, res) => {
res.send();
}
谢谢。
通常我不会直接从另一个中间件调用中间件。它混合了中间件逻辑的职责和中间件的使用位置。
Express 比您想象的更易于配置。也可以在常用路径下安装常用中间件:
如果所有路由使用中间件:
// How common middlewares are normally installed: app.post(middleware1); app.post(middleware2); app.post(middleware3); app.post(middleware4); // Alternative, less common way to do it: app.post(middleware1,middleware2,middleware3,middleware4);
如果只有 url 的特定 模式 使用中间件:
// Use a regexp: app.post(/route(1|2)/, middleware1, middleware2, middleware3, middleware4); // Or if you don't like regexp, use globs: app.post('route*', middleware1, middleware2, middleware3, middleware4); // Or a more specific glob pattern: app.post('route1?2?', middleware1, middleware2, middleware3, middleware4);
如果子路径中的所有 url 使用中间件。例如,假设
/route/...
中的所有 url 都使用中间件:const route = express.Router(); app.use('/route',route); route.post(middleware1); route.post(middleware2); route.post(middleware3); route.post(middleware4);
如果上述 none 对您有吸引力,您仍然可以使用第二个选项,但不是在彼此内部调用中间件,而是编写一个中间件来初始化中间件:
function commonMiddlewares (req, res, next) {
middleware1(req,res,function() {
middleware2(req,res,function() {
middleware3(req,res,function() {
middleware4(req,res,next);
});
});
});
}
可以写成少嵌套的方式:
function commonMiddlewares (req, res, next) {
function runMiddleware4 () {
middleware4(req,res,next);
}
function runMiddleware3 () {
middleware3(req,res,runMiddleware4);
}
function runMiddleware2 () {
middleware2(req,res,runMiddleware3);
}
middleware1(req,res,runMiddleware2);
}
const express = require('express')
const { routesMiddleware } =require('./middlewares')
const { pureVaidationsFunctions1 } =require('./services')
const rout1 =express.Router()
const rout2 =express.Router()
const app = express()
app.use('/route1',route1)
app.use('/route2',route2)
// routesMiddleware a middleware to handle the execution of list of functions
// pureVaidationsFunctions1 list of funtions that `routesMiddleware` will consume
route1.post(routesMiddleware(pureVaidationsFunctions1))
route2.post(routesMiddleware(pureVaidationsFunctions2))
有道理吗?
您可以指定多个中间件,参见the app.use docs:
An array of combinations of any of the above.
您可以创建一个包含所有中间件的文件,例如 -
middlewares.js
module.exports = [
function(req, res, next){...},
function(req, res, next){...},
function(req, res, next){...},
.
.
.
function(req, res, next){...},
]
然后简单地添加它:
/*
you can pass any of the below inside app.use()
A middleware function.
A series of middleware functions (separated by commas).
An array of middleware functions.
A combination of all of the above.
*/
app.use(require('./middlewares.js'));
注意 - 仅对所有此类请求通用的中间件执行此操作。