《Express 面试高频错题集:容易踩坑的 Node.js 后端问题解析》

Express 面试高频错题集解析

以下是 Node.js 后端开发中容易踩坑的 Express 相关问题及深度解析,涵盖常见错误场景和解决方案:


1. 中间件执行顺序问题

典型错误

javascript 复制代码
app.get('/user', (req, res) => {
  res.send('User data');
});
app.use(authMiddleware); // 该中间件不会对上述路由生效

解析

  • Express 中间件按声明顺序执行,路由处理器也是中间件的一种。

  • 正确写法 :将全局中间件声明在路由之前:

    javascript 复制代码
    app.use(authMiddleware); // 优先声明
    app.get('/user', (req, res) => { ... });

关键点

路由匹配后直接响应,后续中间件将被跳过。


2. 异步错误未捕获

典型错误

javascript 复制代码
app.get('/data', async (req, res) => {
  const data = await fetchData(); // 若 fetchData 抛出异常
  res.json(data);
});

解析

  • Express 默认无法捕获异步错误,导致进程崩溃。
  • 解决方案
    • 使用 try/catch

      javascript 复制代码
      app.get('/data', async (req, res) => {
        try {
          const data = await fetchData();
          res.json(data);
        } catch (err) {
          res.status(500).send('Server error');
        }
      });
    • 或采用高阶函数:

      javascript 复制代码
      const asyncHandler = fn => (req, res, next) => 
        Promise.resolve(fn(req, res, next)).catch(next);
      
      app.get('/data', asyncHandler(async (req, res) => {
        const data = await fetchData();
        res.json(data);
      }));

3. 请求体解析遗漏

典型错误

javascript 复制代码
app.post('/submit', (req, res) => {
  console.log(req.body); // 输出 undefined
});

解析

  • Express 4.x 需显式添加请求体解析中间件。

  • 正确配置

    javascript 复制代码
    const express = require('express');
    const bodyParser = require('body-parser');
    
    const app = express();
    app.use(bodyParser.json()); // 解析 JSON 格式
    app.use(bodyParser.urlencoded({ extended: true })); // 解析表单数据

4. 错误处理中间件参数错误

典型错误

javascript 复制代码
app.use((err, req, res) => { // 缺少 next 参数
  res.status(500).send('Error');
});

解析

  • Express 通过参数数量识别错误处理中间件(必须含 4 个参数)。

  • 正确定义

    javascript 复制代码
    app.use((err, req, res, next) => { // 包含 err, req, res, next
      console.error(err.stack);
      res.status(500).send('Internal Server Error');
    });

注意 :普通中间件为 (req, res, next),错误处理需 (err, req, res, next)


5. 静态文件服务路径冲突

典型错误

javascript 复制代码
app.use(express.static('public'));
app.get('/public/data.json', (req, res) => { // 与静态文件路由冲突
  res.send('Custom data');
});

解析

  • Express 优先匹配静态文件路由,导致自定义路由被覆盖。
  • 解决方案
    • 调整静态文件目录名(如改为 assets)。

    • 或为静态文件添加前缀:

      javascript 复制代码
      app.use('/static', express.static('public')); // 通过 /static 访问

总结避坑指南

  1. 中间件顺序:全局中间件 > 路由 > 错误处理。
  2. 异步操作 :始终用 try/catchasyncHandler 封装。
  3. 依赖中间件 :如 body-parsercors 需显式声明。
  4. 错误处理:严格遵循四参数签名。
  5. 路由设计:避免与静态文件路径冲突。

掌握这些核心问题,可规避 90% 的 Express 面试陷阱。实际开发中,结合 Express 官方文档调试中间件执行流程是高效排错的关键。

相关推荐
释怀°Believe8 分钟前
Daily算法刷题【面试经典150题-7️⃣位运算/数学/】
算法·面试·职场和发展
CCPC不拿奖不改名31 分钟前
网络与API:HTTP基础+面试习题
网络·python·网络协议·学习·http·面试·职场和发展
无限码力32 分钟前
华为OD技术面真题 - 计算机网络 - 3
计算机网络·华为od·面试·华为od技术面真题·华为od面试八股文·华为od技术面计算机网络相关
Bigbig.39 分钟前
驱动工程师面试题 - 操作系统1
linux·开发语言·面试·硬件架构
2301_818732061 小时前
下载nvm后,通过nvm无法下载node,有文件夹但是为空 全局cmd,查不到node和npm 已解决
前端·npm·node.js
码农丁丁2 小时前
谈谈面试的本质
面试·职场和发展·技术管理·ai时代的技术管理
亮子AI2 小时前
【MySQL】node.js 如何判断连接池是否正确连接上了?
数据库·mysql·node.js
a程序小傲2 小时前
【Node】单线程的Node.js为什么可以实现多线程?
java·数据库·后端·面试·node.js
独自归家的兔11 小时前
Spring Cloud核心架构组件深度解析(原理+实战+面试高频)
spring cloud·面试·架构
程序员小寒15 小时前
从一道前端面试题,谈 JS 对象存储特点和运算符执行顺序
开发语言·前端·javascript·面试