MST

星途 面试题库

面试题:Node.js HTTP请求错误处理与响应优化

在一个基于Node.js的Web应用中,当HTTP请求发生错误时,不仅要捕获错误,还需要根据不同的错误类型返回合适的HTTP状态码和错误信息给客户端。请描述实现这一过程的思路,并给出关键代码示例。
15.7万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 错误捕获:在处理HTTP请求的路由函数和中间件中,使用try - catch块捕获同步错误,对于异步操作(如数据库查询、文件读取等),可以使用async/await结合try - catch或者使用.catch()链式调用。
  2. 错误类型判断:捕获到错误后,根据错误的类型(如SyntaxErrorReferenceError、自定义错误等)来决定返回给客户端的HTTP状态码和错误信息。
  3. 设置HTTP状态码和返回错误信息:使用Node.js的HTTP响应对象(如res)来设置合适的HTTP状态码(如400表示请求错误,500表示服务器内部错误等),并将错误信息以JSON或者文本格式返回给客户端。

关键代码示例

以下是一个使用Express框架(基于Node.js)的示例:

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

// 模拟一个可能出错的路由
app.get('/example', async (req, res) => {
    try {
        // 模拟一个异步操作,这里使用setTimeout代替真实异步操作
        await new Promise((resolve, reject) => {
            setTimeout(() => {
                // 模拟一个错误
                throw new Error('模拟的服务器错误');
            }, 1000);
        });
        res.send('成功');
    } catch (error) {
        let statusCode = 500;
        let errorMessage = '服务器内部错误';

        if (error instanceof SyntaxError) {
            statusCode = 400;
            errorMessage = '语法错误';
        } else if (error.name === 'CustomError') {
            statusCode = 403;
            errorMessage = '自定义错误,权限不足';
        }

        res.status(statusCode).json({ error: errorMessage });
    }
});

const port = 3000;
app.listen(port, () => {
    console.log(`服务器在端口 ${port} 上运行`);
});

上述代码在处理/example路由时,模拟了一个可能出错的异步操作。当捕获到错误时,根据错误类型设置不同的HTTP状态码和错误信息返回给客户端。如果是SyntaxError设置为400状态码,如果是自定义错误(这里仅示例,实际需要自定义错误类)设置为403状态码,其他未知错误设置为500状态码。