MST

星途 面试题库

面试题:Node.js Express中间件的错误处理及封装

假设你正在开发一个Express应用,有一些业务逻辑可能会抛出错误。请编写一个自定义的中间件来统一处理这些错误,要求这个中间件能够区分不同类型的错误(例如,数据库连接错误、参数验证错误等),并返回合适的HTTP状态码和错误信息。同时,请解释如何将这个错误处理中间件正确地集成到Express应用的中间件链中。
36.3万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试
const express = require('express');
const app = express();

// 自定义错误处理中间件
app.use((err, req, res, next) => {
    let statusCode = 500;
    let errorMessage = 'Internal Server Error';

    if (err.name === 'ValidationError') {
        statusCode = 400;
        errorMessage = 'Parameter validation error';
    } else if (err.code === 'ECONNREFUSED') {
        statusCode = 503;
        errorMessage = 'Database connection error';
    }

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

// 将错误处理中间件放在所有路由和其他中间件之后
// 示例路由
app.get('/', (req, res) => {
    throw new Error('模拟错误');
});

const port = 3000;
app.listen(port, () => {
    console.log(`Server running on port ${port}`);
});

中间件集成解释

  1. 位置:错误处理中间件必须放在所有路由处理程序和其他中间件之后。这是因为Express的中间件执行是线性的,只有当前面的中间件或路由处理程序抛出错误时,才会触发错误处理中间件。
  2. 错误传递:在业务逻辑中,当发生错误时,使用throw语句抛出错误。Express会捕获这些错误并将其传递给错误处理中间件。错误处理中间件的函数签名必须是(err, req, res, next),其中err是抛出的错误对象,reqres分别是请求和响应对象,next是Express的中间件控制函数(在错误处理中间件中通常不需要使用)。通过在中间件内部对err进行判断,区分不同类型的错误,设置合适的HTTP状态码和错误信息,最后通过res.status(statusCode).json({ error: errorMessage })返回给客户端。