【问题标题】:How do I automatically return a 404 when a GET path doesn't exist?当 GET 路径不存在时,如何自动返回 404?
【发布时间】:2018-06-15 10:09:09
【问题描述】:

我正在使用 NodeJS、Express 和 Handlebars(模板引擎)来构建 Web 应用程序。目前,我正在尝试在用户输入不存在的 URL 时(或当他们可能无权访问它时)自动重定向用户。

以下返回索引页面:

router.get('/', (req, res) => {
    res.render('index/index');
});

但是我该如何做这样的事情:

router.get('/:ThisCouldBeAnything', (req, res) => {
    res.render('errors/404');
});

以下示例来自 Github:

假设我输入了这个网址:

https://github.com/thispagedoesnotexist

它会自动返回 404。如何在我的应用程序中实现它?

提前致谢。

【问题讨论】:

    标签: node.js express handlebars.js http-status-code-404


    【解决方案1】:

    在所有路由处理程序之后使用中间件来捕获不存在的路由:

    app.get('/some/route', function (req, res) {
        ...
    });
    
    app.post('/some/other/route', function (req, res) {
        ...
    });
    
    ...
    
    // middleware to catch non-existing routes
    app.use( function(req, res, next) {
    
        // you can do what ever you want here
        // for example rendering a page with '404 Not Found'
        res.status(404)
        res.render('error', { error: 'Not Found'});
    
    });
    

    【讨论】:

    • 感谢您的快速回复。我将使用你的中间件功能!
    • 我相信我还不能这样做,因为我是新来的。
    • 我做了,但它指出:声望低于 15 人的投票会被记录,但不要更改公开显示的帖子分数。
    • 另一种方法是使用http-errors,如MDN中所述
    • 只是补充一点,你应该把它也放在路线之后才能正常工作。谢谢。
    【解决方案2】:

    在所有其他路线之后,您可以添加:

    app.get('*', (req, res) => {
      res.render('errors/404');
    });
    

    或者,您可以在所有其他中间件和路由之后使用中间件功能。

    app.use((req, res) => {
      res.render('errors/404');
    });
    

    所以你最终可能会得到如下所示的内容:

    //body-parser, cookie-parser, and other middleware etc up here
    
    //routes
    app.get('/route1', (req, res) => {
      res.render('route1');
    });
    
    app.get('/route2', (req, res) => {
      res.render('route2');
    });
    
    //404 handling as absolute last thing
    //You can use middleware
    app.use((req, res) => {
      res.render('errors/404');
    });
    
    //Or a catch-all route
    app.get('*', (req, res) => {
      res.render('errors/404');
    });
    

    【讨论】:

    • 对不起,YouneL。我不是想窃取你的答案。当你写你的帖子时,我一定在编辑我的帖子。
    • 另外,看起来我在您写答案前几分钟发布了我的中间件建议编辑。但我更充实的例子是在你回答之后发布的。
    • 没有,你的第一篇文章是关于使用星号的,因为它匹配所有路线
    • 是的,没错。我添加中间件建议的编辑在您的回答之前。
    【解决方案3】:

    我看到你已经标记了快递。您所要做的就是包含一个默认处理程序,其中包含

    res.status(404).render('404template')
    

    例如

    app.get('*', (req, res,next) => {
         res.status(404).render('error.ejs')
    });
    

    【讨论】:

    • 这对正斜杠'/'不起作用,不应该像上面的回复那样是“*”吗?
    猜你喜欢
    • 2015-11-08
    • 2022-09-28
    • 2022-12-10
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多