我想验证一些东西,但无法在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可以接受的参数,但提到我在文档中找不到它。
答案 0 :(得分:67)
请考虑以下示例:
var 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”是两个不同的中间件。
答案 1 :(得分:34)
它没有说"无限"但它确实说你可以在文档中添加多个中间件功能(称为"回调" )here:
router.METHOD(path,[callback,...] callback)
...
你可以提供多个回调,并且所有回调都是平等的,并且行为就像中间件一样,除了这些回调可能会调用下一个(' route')以绕过剩余的路径回调(S)。您可以使用此机制在路由上执行前置条件,然后在没有理由继续匹配路由时将控制权传递给后续路由。
正如您所看到的,中间件函数和通常处理请求的函数(通常是添加到列表中的最后一个函数的函数)之间没有区别。
10不应该是一个问题(如果你真的需要)。
答案 2 :(得分:3)
快速版本“ 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);
让我们尝试一个真实的例子:
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
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;