Nodejs 如何来捕捉错误呢?像404 这样的

Nodejs 如何来捕捉错误呢?像404 这样的

我看了下网上写的大部分都是说在所有的路由规则之后写上

        res.render('404.html', {
        title: 'No Found'
    })
});``` 
这样写 确实是可以实现404的捕捉的,但是我个人总觉得这种做法有点投机技巧,而且假如我在想其他的错误呢?
所以我的想法是能不能直接在http里面获取到404相关的信息? 但是我查看了request的信息 没有看到有关的信息,
```headers: 
      { host: 'localhost:3000',
        connection: 'keep-alive',
        accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'user-agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
        'accept-encoding': 'gzip,deflate,sdch',
        'accept-language': 'zh-CN,zh;q=0.8',
        cookie: 'username=admin',
        'if-none-match': 'W/"9c-2619173066"' },```
所以想请教各位是如何捕捉各种错误的?

10 回复

要有效地捕获和处理错误,特别是在Node.js中处理HTTP请求时,你可以利用中间件(middleware)来处理未捕获的错误。这种方式不仅适用于404错误,还可以扩展到其他类型的错误处理。

404 错误的捕获

首先,确保在所有路由定义之后添加一个通用的错误处理器,用于处理任何未匹配到具体路由的情况。这通常通过使用app.use()方法来实现:

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

// 假设这里已经定义了一些路由

// 通用错误处理器
app.use((req, res, next) => {
    // 如果没有找到匹配的路由,响应404状态码
    res.status(404).render('404.html', { title: 'Not Found' });
});

捕获其他错误

对于非404类型的错误,如服务器内部错误(500),可以设置一个全局错误处理器来捕获这些错误。这个处理器会接收四个参数,这是Express框架用来标识这是一个错误处理函数的标准。

app.use((err, req, res, next) => {
    console.error(err.stack);  // 打印堆栈跟踪到控制台
    res.status(500).send('Something broke!');  // 发送500状态码和错误信息
});

使用try-catch处理异步代码中的错误

在处理异步操作时(例如数据库查询、文件读取等),错误可能不会立即显现。为了捕捉这些错误,可以在异步函数中使用try...catch结构,或者使用.catch()方法来处理Promise的拒绝。

app.get('/someRoute', async (req, res, next) => {
    try {
        const data = await someAsyncFunction();
        res.send(data);
    } catch (error) {
        next(error);  // 将错误传递给错误处理器
    }
});

在这个例子中,如果someAsyncFunction()抛出错误或返回一个被拒绝的Promise,catch块会捕获该错误,并调用next(error)将错误传递给Express的错误处理链。

通过这种方式,你不仅可以处理常见的404错误,还能优雅地处理其他类型的应用程序错误,确保用户得到清晰的反馈,同时维护应用的稳定性和可维护性。


问题没解决 帖子不能沉

各位前辈你们是怎么做404页面的呢?

不明白,路由中没找到对应的处理,最后输出404,那你根据什么来处理非404呢?

能举个例子吗?

哎呀,我去找遍了全世界都是把404的路由放在最后,莫非真的只有这种方式来处理了?

stackoverflow已经解决这个问题,请参考Node.js/Express - Render error when page not found

这个有那么难理解吗,所有的路由规则都不符合自然就是404了,至于500那不是还有一个带四个参数的错误处理吗

状态码是服务器根据浏览器的request响应后设置的, 404代表响应正常, 服务器没有出错, 但是路由不匹配的情况, 一般框架里面都做好了, 在路由不匹配也无错误的时候, 框架自动设置404状态码返回, 有错误的时候, 框架设置500状态码, 重定向的时候,框架设置302状态码, 成功的时候框架设置状态码为200

当然可以自己更语义化的设置状态码

对于Node.js中的错误处理,尤其是在Express框架中,可以使用中间件来捕获404错误以及其他类型的错误。使用app.get('*', ...)的方式确实可以捕捉到未匹配到路由的请求,但如果你想更全面地处理错误,可以考虑以下几个方面:

全局错误处理中间件

你可以定义一个全局错误处理中间件来捕获应用程序级别的错误。例如:

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

// 定义一个简单的路由
app.get('/', (req, res) => {
    res.send('Hello World!');
});

// 捕获404错误
app.use((req, res, next) => {
    res.status(404).sendFile(__dirname + '/404.html');
});

// 全局错误处理中间件
app.use((err, req, res, next) => {
    console.error(err.stack);
    res.status(500).send('Something broke!');
});

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

在这个例子中,app.use()用于定义错误处理中间件,它接收四个参数(err, req, res, next)。当应用程序抛出错误时,会进入这个中间件,并且可以根据需要发送自定义的错误响应。

请求未找到的情况

对于未找到的路由(如上面例子中的app.get('*', ...))),使用通配符*来匹配所有未定义的路由是一种常见做法。但是,为了保持代码的清晰性,通常会将它放在所有其他路由定义之后。

处理其他错误类型

除了404错误外,如果需要处理其他错误(例如500内部服务器错误),可以在中间件中加入适当的逻辑来检查错误类型,并根据错误类型返回不同的响应。

以上就是如何在Node.js(特别是使用Express)中处理和捕捉错误的基本方法。希望这对你有所帮助!

回到顶部