为什么我的 Node.js 服务器针对有效路由返回 404 错误? [重复]

问题描述 投票:0回答:1

我正在使用 Express 构建 Node.js 服务器,并且我定义了一些这样的路由:

const express = require('express');
const app = express();

app.get('/api', (req, res) => {
  res.send('API Route');
});

app.get('/home', (req, res) => {
  res.send('Home Route');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

当我运行服务器并在浏览器中访问 http://localhost:3000/home 或 http://localhost:3000/api 时,我得到了预期的响应。但是,如果我尝试访问 http://localhost:3000/home/ (带有尾部斜杠),它会返回 404 错误。 为什么会发生这种情况,如何让我的路线正确处理尾部斜杠?

我尝试使用尾部斜杠显式添加更多路由,如下所示:

app.get('/home/', (req, res) => {
  res.send('Home Route');
});

这可行,但我期望 Express 能够自动处理尾部斜杠。我不想重复路线。我怎样才能有效地处理这个问题?

node.js express http routes middleware
1个回答
1
投票

问题在于 Express 将带有和不带有尾部斜杠的路由视为不同的路由。如果您希望您的路由能够处理这两种情况(带或不带尾部斜杠),您可以使用像 app.use() 这样的中间件来标准化您的路由。

以下是如何在全球范围内处理此问题的示例:

app.use((req, res, next) => {
  if (req.path.endsWith('/') && req.path.length > 1) {
    const newPath = req.path.slice(0, -1);
    res.redirect(301, newPath);
  } else {
    next();
  }
});

这会将带有尾部斜杠的任何路由重定向到不带尾部斜杠的同一路由。例如,/home/将被重定向到/home。

或者,您可以使用 Express 中的 strict 选项全局忽略尾部斜杠:

const app = express();
app.set('strict routing', false);
© www.soinside.com 2019 - 2024. All rights reserved.