在 ExpressJS 中为特定路由链接多个中间件
Chaining multiple pieces of middleware for specific route in ExpressJS
我只想验证一些东西,但无法在 Express 文档或网上找到任何与此相关的内容(尽管我知道这是一个功能)。
我可以对此进行测试,但我确实没有合适的模板,想听听社区的意见。
如果我像这样在 express 中定义路由:
app.get('/', function (req, res) {
res.send('GET request to homepage');
});
我也可以自己定义一个中间件,直接加载,比如
middleware = function(req, res){
res.send('GET request to homepage');
});
app.get('/', middleware)
但是,我也可以将这些路由中的至少一个链接到 运行 额外的中间件,例如身份验证,如下所示:
app.get('/', middleware, function (req, res) {
res.send('GET request to homepage');
});
这些可以无限链接吗?如果我愿意,我可以在给定的路由上添加 10 个中间件函数吗?我想查看 app.get 可以接受的参数,但如前所述,我在文档中找不到它。
这不是说“无限”,而是说您可以添加多个中间件函数(在文档中称为 “回调”)here:
router.METHOD(path, [callback, ...] callback)
...
You can provide multiple callbacks, and all are treated equally, and behave just like middleware, except that these callbacks may invoke next('route') to bypass the remaining route callback(s). You can use this mechanism to perform pre-conditions on a route then pass control to subsequent routes when there is no reason to proceed with the route matched.
如您所见,中间件函数和通常处理请求的函数(通常是添加到列表中的最后一个函数)之间没有区别。
拥有 10 个应该不是问题(如果你真的需要的话)。
考虑以下示例:
const middleware = {
requireAuthentication: function(req, res, next) {
console.log('private route list!');
next();
},
logger: function(req, res, next) {
console.log('Original request hit : '+req.originalUrl);
next();
}
}
现在您可以使用以下代码添加多个中间件:
app.get('/', [middleware.requireAuthentication, middleware.logger], function(req, res) {
res.send('Hello!');
});
所以,从上面这段代码可以看出,requireAuthentication
和logger
是添加的两个不同的中间件。
Express版本“express”:“^4.17.1”或以上
来自文档:中间件系列
var r1 = express.Router();
r1.get('/', function (req, res, next) {
next();
});
var r2 = express.Router();
r2.get('/', function (req, res, next) {
next();
});
app.use(r1, r2);
让我们举一个现实生活中的例子:
tourController.js
exports.checkBody = (req, res, next)=>{ // middleware 1
if (!req.body.price){
return res.status(400).json({
status:'fail',
message:'Missing price!!!'
})
}
next();
}
exports.createTour = (req, res) => { // middleware 2
tours.push(req.body);
fs.writeFile(
`${__dirname}/dev-data/data/tours-simple.json`,
JSON.stringify(tours),
(err) => {
res.status(201).json({
status: 'success',
data: {
tour: newTour,
},
});
}
);
};
tourRouter.js
const express = require('express');
const tourController = require('./../controller/tourController')
const router = express.Router();
router.route('/')
.get(tourController.getAllTours)
.post(tourController.checkBody, tourController.createTour);
//muliple Middleware in post route
module.exports = router //need this or the following step will break
app.js
const express = require('express');
const tourRouter = require('./route/tourRouter');
const app = express();
app.use(express.json());
app.use('/api/v1/tours', tourRouter);
module.exports = app;
我只想验证一些东西,但无法在 Express 文档或网上找到任何与此相关的内容(尽管我知道这是一个功能)。
我可以对此进行测试,但我确实没有合适的模板,想听听社区的意见。
如果我像这样在 express 中定义路由:
app.get('/', function (req, res) {
res.send('GET request to homepage');
});
我也可以自己定义一个中间件,直接加载,比如
middleware = function(req, res){
res.send('GET request to homepage');
});
app.get('/', middleware)
但是,我也可以将这些路由中的至少一个链接到 运行 额外的中间件,例如身份验证,如下所示:
app.get('/', middleware, function (req, res) {
res.send('GET request to homepage');
});
这些可以无限链接吗?如果我愿意,我可以在给定的路由上添加 10 个中间件函数吗?我想查看 app.get 可以接受的参数,但如前所述,我在文档中找不到它。
这不是说“无限”,而是说您可以添加多个中间件函数(在文档中称为 “回调”)here:
router.METHOD(path, [callback, ...] callback)
...
You can provide multiple callbacks, and all are treated equally, and behave just like middleware, except that these callbacks may invoke next('route') to bypass the remaining route callback(s). You can use this mechanism to perform pre-conditions on a route then pass control to subsequent routes when there is no reason to proceed with the route matched.
如您所见,中间件函数和通常处理请求的函数(通常是添加到列表中的最后一个函数)之间没有区别。
拥有 10 个应该不是问题(如果你真的需要的话)。
考虑以下示例:
const middleware = {
requireAuthentication: function(req, res, next) {
console.log('private route list!');
next();
},
logger: function(req, res, next) {
console.log('Original request hit : '+req.originalUrl);
next();
}
}
现在您可以使用以下代码添加多个中间件:
app.get('/', [middleware.requireAuthentication, middleware.logger], function(req, res) {
res.send('Hello!');
});
所以,从上面这段代码可以看出,requireAuthentication
和logger
是添加的两个不同的中间件。
Express版本“express”:“^4.17.1”或以上
来自文档:中间件系列
var r1 = express.Router();
r1.get('/', function (req, res, next) {
next();
});
var r2 = express.Router();
r2.get('/', function (req, res, next) {
next();
});
app.use(r1, r2);
让我们举一个现实生活中的例子:
tourController.js
exports.checkBody = (req, res, next)=>{ // middleware 1
if (!req.body.price){
return res.status(400).json({
status:'fail',
message:'Missing price!!!'
})
}
next();
}
exports.createTour = (req, res) => { // middleware 2
tours.push(req.body);
fs.writeFile(
`${__dirname}/dev-data/data/tours-simple.json`,
JSON.stringify(tours),
(err) => {
res.status(201).json({
status: 'success',
data: {
tour: newTour,
},
});
}
);
};
tourRouter.js
const express = require('express');
const tourController = require('./../controller/tourController')
const router = express.Router();
router.route('/')
.get(tourController.getAllTours)
.post(tourController.checkBody, tourController.createTour);
//muliple Middleware in post route
module.exports = router //need this or the following step will break
app.js
const express = require('express');
const tourRouter = require('./route/tourRouter');
const app = express();
app.use(express.json());
app.use('/api/v1/tours', tourRouter);
module.exports = app;