Node.js 在ExpressJS中为特定路由链接多个中间件

Node.js 在ExpressJS中为特定路由链接多个中间件,node.js,express,middleware,Node.js,Express,Middleware,我只想验证一些东西,但在Express文档或在线上找不到与此相关的任何内容(尽管我知道这是一项功能) 我可以测试一下,但是我没有一个好的模板,我想听听社区的意见 如果我在express中定义了这样的路线: app.get('/', function (req, res) { res.send('GET request to homepage'); }); 我还可以定义一个中间件并直接加载它,例如 middleware = function(req, res){ res.send('GE

我只想验证一些东西,但在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可以接受的参数,但正如前面提到的,我在文档中找不到它。

它不是说“无限”,而是说可以添加多个中间件功能(文档中称为“回调”):

方法(路径,[callback,…]callback)

您可以提供多个回调,所有回调都被平等对待,其行为就像中间件一样,只是这些回调可以调用下一个(“路由”)来绕过其余的路由回调。您可以使用此机制对路由执行前置条件,然后在没有理由继续匹配路由时将控制权传递给后续路由

如您所见,中间件函数和通常处理请求的函数(通常是添加到列表中的最后一个函数)之间没有区别


拥有10个不应该是个问题(如果你真的需要的话)。

考虑以下示例:

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”是添加的两个不同的中间件。

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 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;

是的,它们是无限链接的,AFAIK Express将第一个参数“get”作为模式匹配,所有后续参数都是中间件。按照编码,您的中间件将始终发送响应,因此不会运行以下中间件。使用
函数(req,res,next){…next()}
让位于链中的下一个中间件。好的,谢谢!你在文档中找到了我找不到的部分。不,我甚至不需要链接两个以上的API,但我只是想知道API是如何构造的。再次感谢!这完全需要教程和文档的认可。非常感谢你的建议!谢谢,我想知道我是否可以在thereHi中传入一个数组-当使用此方法时,是否适合将内容添加到req对象,以便在以后的中间件中进行访问?例如,在第一个:req.user=user.find。。。
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;