我在Express中定义了静态和动态路由,并且已经构建了一个通用响应器来将响应发送到客户端。 响应者是所有路由的全局响应者,因此在末尾添加。

但是,当我定义静态路由时,将匹配动态路由的中间件添加到响应者之前的堆栈中。

为了显示:

server.get('/hello/test', function(req, res, next) {
    console.log('/hello/test');
    next();
});
server.get('/hello/:page', function(req, res, next) {
    console.log('/hello/:page');
    next();
});
server.use(function(req, res, next) {
    res.status(200).send('test');
});

在响应者中间件被调用之前,调用curl localhost:3000/hello/test将在console.log上同时记录“ / hello / test”和“ / hello /:page”。 我只希望第一个匹配的路由中间件被调用。

无论如何,有什么办法可以防止这种行为?

#1楼 票数:0

next()方法将控件传递给下一个处理程序。 您只需从路由中删除next()调用,然后将中间件放入函数即可解决问题:

server.get('/hello/test', myMiddleware(req, res, next), function(req, res) {
    console.log('/hello/test');
});
server.get('/hello/test_b', myMiddleware(req, res, next), function(req, res) {
    console.log('/hello/test_b');
});
server.get('/hello/:page', myMiddleware(req, res, next), function(req, res) {
    console.log('/hello/:page');
});
server.get('*', myMiddleware(req, res, next), function (req, res) {
    res.type('txt').send('Not found');
});


function myMiddleware(req, res, next) {
    console.Log("in midleware")
    next();
}

  ask by lohfu translate from so

未解决问题?本站智能推荐:

1回复

Express.js仅将中间件添加到一条特殊路由中

我有一条需要处理文件的路线。 所以我正在使用强大的中间件。 这就是我添加强大的中间件的方式。 但是以这种方式添加此中间件也会导致它也影响所有其他路由。 有什么方法可以将中间件添加到一个特定的路由而又不影响其他路由?
3回复

将./routes中的所有路由添加到中间件堆栈

现在,我对我的路由目录中的每条路由使用app.use()和require()将它们添加到中间件堆栈中(我正在使用Express)。 与其对每个文件手动执行操作,不如使用for循环遍历./routes中的路由文件,并将每个文件添加到中间件堆栈中。 这是我所拥有的,但不起作用: 有人可以帮
1回复

快速路由中间件原因404

我有一个具有路线的快速应用,在app.js中称为如下 我的app.js文件中还包含在错误处理中间件之前使用的中间件 问题在于,当未对中间件进行注释时,用户路由返回404,但是当对中间件进行注释时,路由用户将正常工作。 知道发生了什么
1回复

NodeJs路由中间件错误

我正在尝试实现一个中间件,该中间件将在服务器交付页面之前检查用户是否已通过身份验证。 尽管看起来这样做很简单,但是节点抛出了一个错误,提示“发送标头后无法设置标头”。 我的路由器的代码是: myAuthenticatedPage.js: myLoginPage.js: chec
1回复

如何终止路由中间件链?

我有一个带有身份验证中间件的简单Express路由器设置。 我有类似下面的代码。 如果用户使用不正确的凭据导航到“ /验证”,则我希望中间件发送错误响应,并停止所有中间件和路由处理。 为此,我发送了一个响应,告诉Express跳过带有next('route')的其余路由中间件,并包含一个
1回复

为什么我的快速通配符路由会覆盖我的静态中间件?

我遇到了Express v.4.14的问题。 我的通配符路由似乎覆盖了我的静态中间件。 这是代码: 由于某种原因,对“ /public/SomeExistingFile.js”的请求将返回“ /index.html”。 如果删除通配符(*),则不会覆盖静态中间件,但不再匹配任意路由。
2回复

将中间件添加到除少数几个路由外的所有路由

如何将中间件添加到所有可能的路由中,除了那些匹配给定表达式的路由? 我知道如何向匹配表达式的中间件添加中间件: 但我想要求所有路径中的登录名,除了一些路径中具有特定前缀的登录名。
1回复

使功能成为路由中的快速中间件

因此,我有一条路线,并且我要制造中间件的路线中有一些难看的代码。 唯一的问题是Express的文档不清楚,而我的代码只是404s。 我该怎么做? 路线: 功能: