如何仅在丢失的路线上将 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?的主要内容,如果未能解决你的问题,请参考以下文章

Express.js - 可以找到我的路线

如何使用 Tailwind CSS 仅在小型设备上将导航栏上的项目居中

Express js 路由无法与 MEAN 堆栈按预期工作

如何在 express 项目中将 css 链接到 html?

使用 Express.js 在 Node.js 中设置路由的最佳方式

Express.JS:如何按名称而不是数字设置响应状态?