MST

星途 面试题库

面试题:Node.js自定义HTTP中间件中的错误处理策略

假设你正在编写一个Node.js的自定义HTTP中间件,在中间件处理逻辑中可能会出现各种不同类型的错误,例如网络错误、数据解析错误等。请阐述你会采用什么样的错误处理策略,如何捕获这些错误,并将合适的错误信息返回给客户端,同时还要保证中间件的稳定性和后续中间件的正常执行。
40.9万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
  1. 错误处理策略
    • 使用try - catch块来捕获同步代码中的错误。对于异步操作,使用async - await结合try - catch来处理可能出现的错误。
    • 定义不同类型的错误类,以便于区分和处理不同类型的错误,例如网络错误可以定义为NetworkError类,数据解析错误可以定义为ParseError类等。
  2. 捕获错误
    • 同步代码
try {
    // 可能会抛出错误的同步代码,比如数据解析
    const data = JSON.parse('{invalid json}');
} catch (error) {
    // 捕获错误
    if (error instanceof SyntaxError) {
        // 处理数据解析错误
        const parseError = new ParseError('数据解析错误', error);
        // 后续处理,如记录日志,返回错误给客户端
    }
}
  • 异步代码
async function asyncOperation() {
    try {
        // 可能会抛出错误的异步操作,比如网络请求
        const response = await fetch('invalid - url');
    } catch (error) {
        // 捕获错误
        if (error.name === 'TypeError') {
            // 处理网络错误(这里简单以TypeError为例,实际网络错误可能更复杂)
            const networkError = new NetworkError('网络错误', error);
            // 后续处理,如记录日志,返回错误给客户端
        }
    }
}
  1. 返回错误信息给客户端
    • 在捕获到错误后,根据错误类型构造合适的HTTP响应。例如,对于数据解析错误,可以返回HTTP 400 Bad Request状态码,对于网络错误可以返回HTTP 500 Internal Server Error状态码。
const http = require('http');
const server = http.createServer((req, res) => {
    try {
        // 中间件逻辑
    } catch (error) {
        if (error instanceof ParseError) {
            res.writeHead(400, { 'Content - Type': 'application/json' });
            res.end(JSON.stringify({ error: '数据解析错误' }));
        } else if (error instanceof NetworkError) {
            res.writeHead(500, { 'Content - Type': 'application/json' });
            res.end(JSON.stringify({ error: '网络错误' }));
        }
    }
});
server.listen(3000);
  1. 保证中间件稳定性和后续中间件正常执行
    • 在捕获错误并处理后,避免让错误向上抛出,从而保证当前中间件不会因为未处理的错误而崩溃。
    • 如果使用了Express等框架,可以利用其错误处理中间件机制,将错误传递给专门的错误处理中间件,而不是在每个中间件内部直接结束响应。这样可以保证后续中间件有机会执行一些清理或记录操作等。
const express = require('express');
const app = express();
app.use((req, res, next) => {
    try {
        // 中间件逻辑
        next();
    } catch (error) {
        next(error);
    }
});
app.use((error, req, res, next) => {
    // 集中处理错误
    if (error instanceof ParseError) {
        res.status(400).json({ error: '数据解析错误' });
    } else if (error instanceof NetworkError) {
        res.status(500).json({ error: '网络错误' });
    }
});
app.listen(3000);