You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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为空,核心原因是路由参数的设置语法错误。

错误原因

  1. 路由定义未使用参数占位符:原代码中app.use绑定的是固定URL路径,Express无法识别其中的动态参数,自然不会把对应值注入到req.params中。
  2. 测试请求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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:22:47