使用Jest测试带URL参数的API时req.params为空的问题排查
解决Jest测试PUT API时req.params为空的问题
问题现状
要测试的PUT API端点为http://localhost/universities/ucla/class/2013/studentalis/johndoe,Postman测试可正常返回201状态码,但Jest测试出现超时,且updateStudent.js中的getQuery函数抛出以下错误:
TypeError: Cannot read properties of undefined (reading 'toString') 226 | return { > 227 | universityName: req.params.universityName.toString(), | ^ 228 | class: req.params.class.toString(), 229 | studentAlias: req.params.studentAlias.toString()
调试发现req.params为空,核心原因是路由参数的设置语法错误。
错误原因
- 路由定义未使用参数占位符:原代码中
app.use绑定的是固定URL路径,Express无法识别其中的动态参数,自然不会把对应值注入到req.params中。 - 测试请求URL错误:测试代码中
put方法的URL开头缺少/,且请求体变量名写错(createInstanceRequestBody应为updateStudentRequestBody)。
修复步骤
1. 修正路由定义
将路由改为带参数占位符的形式,让Express能解析URL中的动态参数:
const express = require("express"); const request = require("supertest"); const updateStudentRoute= require('../handlers/updateStudent'); const app = express(); app.use(express.json()); // 使用参数占位符定义路由,对应URL中的动态部分 app.use('/universities/:universityName/class/:class/studentalis/:studentAlias/:studentId', updateStudentRoute);
这里的:universityName、:class、:studentAlias、:studentId会自动匹配URL中的ucla、2013、studentalis、johndoe,并赋值到req.params对象中。
2. 修正测试代码
修复请求URL的路径问题,并使用正确的请求体变量:
describe('Update Student Details in Database', () => { it('Update Student Details in Database', async() => { const updateStudentRequestBody = require('./updateStudentRequestBody'); const response = await request(app) // URL开头加上/,并使用正确的路径 .put(`/universities/ucla/class/2013/studentalis/johndoe`) // 使用正确的请求体变量 .send(updateStudentRequestBody); expect(response.statusCode).toBe(201); }); });
额外注意
确保updateStudentRoute内部是处理PUT请求的逻辑,比如如果是单独的路由文件,应该类似这样:
// handlers/updateStudent.js const router = require('express').Router(); router.put('/', (req, res) => { // 这里可以正常访问req.params.universityName等参数 const query = getQuery(req); // 后续更新逻辑... res.status(201).send('Updated'); }); module.exports = router;
内容的提问来源于stack exchange,提问作者superninja
相关产品推荐
相关产品推荐

