Express 面试高频错题集解析
以下是 Node.js 后端开发中容易踩坑的 Express 相关问题及深度解析,涵盖常见错误场景和解决方案:
1. 中间件执行顺序问题
典型错误:
javascript
app.get('/user', (req, res) => {
res.send('User data');
});
app.use(authMiddleware); // 该中间件不会对上述路由生效
解析:
-
Express 中间件按声明顺序执行,路由处理器也是中间件的一种。
-
正确写法 :将全局中间件声明在路由之前:
javascriptapp.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:javascriptapp.get('/data', async (req, res) => { try { const data = await fetchData(); res.json(data); } catch (err) { res.status(500).send('Server error'); } }); -
或采用高阶函数:
javascriptconst 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 需显式添加请求体解析中间件。
-
正确配置 :
javascriptconst 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 个参数)。
-
正确定义 :
javascriptapp.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)。 -
或为静态文件添加前缀:
javascriptapp.use('/static', express.static('public')); // 通过 /static 访问
-
总结避坑指南
- 中间件顺序:全局中间件 > 路由 > 错误处理。
- 异步操作 :始终用
try/catch或asyncHandler封装。 - 依赖中间件 :如
body-parser、cors需显式声明。 - 错误处理:严格遵循四参数签名。
- 路由设计:避免与静态文件路径冲突。
掌握这些核心问题,可规避 90% 的 Express 面试陷阱。实际开发中,结合 Express 官方文档调试中间件执行流程是高效排错的关键。