如何仅在丢失的路线上将 Express.js 设置为 404?
Posted
技术标签:
【中文标题】如何仅在丢失的路线上将 Express.js 设置为 404?【英文标题】:How can I get Express.js to 404 only on missing routes? 【发布时间】:2012-07-15 01:24:08 【问题描述】:目前,我的所有其他路线下方都有以下内容:
app.get('*', function(req, res)
console.log('404ing');
res.render('404');
);
根据日志,即使上面匹配了路由,它也会被触发。我怎样才能让它只在没有匹配的时候触发?
【问题讨论】:
为了支持@Charles 的回答,我只想告诉您,Express 文档页面的 URL 已移至常见问题解答 http://expressjs.com/starter/faq.html#how-do-you-handle-404s 见expressjs.com/en/starter/faq.html#how-do-i-handle-404-responses 【参考方案1】:你只需要把它放在所有路线的末尾。
看看Passing Route Control的第二个例子:
var express = require('express')
, app = express.createServer();
var users = [ name: 'tj' ];
app.all('/user/:id/:op?', function(req, res, next)
req.user = users[req.params.id];
if (req.user)
next();
else
next(new Error('cannot find user ' + req.params.id));
);
app.get('/user/:id', function(req, res)
res.send('viewing ' + req.user.name);
);
app.get('/user/:id/edit', function(req, res)
res.send('editing ' + req.user.name);
);
app.put('/user/:id', function(req, res)
res.send('updating ' + req.user.name);
);
app.get('*', function(req, res)
res.send('what???', 404);
);
app.listen(3000);
您也可以什么都不做,因为所有不匹配的路由都会产生 404。然后您可以使用此代码显示正确的模板:
app.error(function(err, req, res, next)
if (err instanceof NotFound)
res.render('404.jade');
else
next(err);
);
它记录在Error Handling。
【讨论】:
请注意res.send('what???', 404);
已弃用,请改用res.status(404).send('what???');
。
链接失效
请注意,app.error()
在 3.x 中已被删除。使用app.use()
而不是传入上面相同的中间件。 github.com/expressjs/express/wiki/Migrating-from-2.x-to-3.x【参考方案2】:
我敢打赌,您的浏览器正在跟进对网站图标的请求。这就是为什么您在请求页面成功 200 之后在日志中看到 404。
设置网站图标路由。
【讨论】:
所以,基本上:app.get('*.ico', function())
。我从不从我的节点服务器提供.ico
文件,所以我不需要比这更严格。您可以通过转到浏览器中定义的路由而不是使用 ajax 或 curl 或类似的方法转到同一路由来确认这是问题所在。
天哪。我只需将console.log("/* =>", req.originalUrl);
放入后备路线即可确认这是我的问题。我不敢相信就是这样。谢谢!
在我的情况下,它是一个丢失的文件,但我的错误报告没有显示 URL。它现在...【参考方案3】:
希望对您有所帮助,我在路线底部使用了此代码
router.use((req, res, next) =>
next(
status: 404,
message: 'Not Found',
);
);
router.use((err, req, res, next) =>
if (err.status === 404)
return res.status(400).render('404');
if (err.status === 500)
return res.status(500).render('500');
next();
);
【讨论】:
【参考方案4】:你可以在所有路线的尽头这样做,
const express = require('express');
const app = express();
const port = 8080;
// All your routes and middleware here.....
app.use((req, res, next) =>
res.status(404).json(
message: 'Ohh you are lost, read the API documentation to find your way back home :)'
)
)
// Init the server here,
app.listen( port, () =>
console.log('Sever is up')
)
【讨论】:
【参考方案5】:我想要一个只能在丢失的路线上呈现我的 404 页面的全部内容,并在错误处理文档 https://expressjs.com/en/guide/error-handling.html 中找到它。
app.use(function (err, req, res, next)
console.error(err.stack)
res.status(404).render('404.ejs')
)
这对我有用。
【讨论】:
【参考方案6】:你可以用这个
const express = require('express');
const app=express();
app.set('view engine', 'pug');
app.get('/', (req,res,next)=>
res.render('home');
);
app.use( (req,res,next)=>
res.render('404');
)
app.listen(3000);
【讨论】:
【参考方案7】:很简单,你可以添加这个中间件。
app.use(function (req, res, next)
//Capture All 404 errors
res.status(404).render("404.ejs")
)
服务中的 404 错误通常用于表示请求的资源不可用。在本文中,我们将了解如何处理 express 中的 404 错误。
【讨论】:
以上是关于如何仅在丢失的路线上将 Express.js 设置为 404?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Tailwind CSS 仅在小型设备上将导航栏上的项目居中
如何在 express 项目中将 css 链接到 html?