我正在使用 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 能够自动处理尾部斜杠。我不想重复路线。我怎样才能有效地处理这个问题?
问题在于 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);