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

Express JS中存在参数时req.params为空的问题排查

Express中间件中req.params.userId始终为undefined且根路径触发错误的问题求助

我为学生搭建了一个Express.js服务器用于技术练习,包含创建、获取所有用户的路由,还有根据ID获取、删除用户的常规路由。为学习中间件的使用,我们编写了一个验证userId参数的中间件,若参数无效则返回错误码,使用的正则表达式如下:

// ./middlewares/validateUserId.js

const USER_ID_REGEX = /[^a-f0-9-]/i;

const validateUserId = (req, res, next) => {
  const { userId } = req.params;
  const isValidUserId = !userId.match(USER_ID_REGEX); // <-- 注意此行

  if (!isValidUserId) {
    return res.status(400).json({ message: 'Invalid User ID' });
  }

  next();
};

module.exports = { validateUserId };

随后我在服务器入口文件中使用该中间件,简化后的代码如下:

// ./index.js

const express = require('express');
const { validateUserId } = require('./middlewares/validateUserId');

const app = express();

app.use(express.json());

app.get('/users', (req, res) => {/* ... */});

app.post('/users', (req, res) => {/* ... */});

app.put('/users', (req, res) => {/* ... */});

app.use(validateUserId); // <-- 中间件位置

app.get('/users/:userId', (req, res) => {
  const { userId } = req.params;
  // ... 其他逻辑
});

app.delete('/users/:userId', (req, res) => {
  const { userId } = req.params;

  // ... 其他逻辑
});

app.listen(1234, () => {
  console.log('Server listening on http://localhost:1234');
});

问题现象

  • req.params始终是空对象,中间件中userId始终为undefined
  • 访问根路径http://localhost:1234时,出现以下错误:
TypeError: Cannot read properties of undefined (reading 'match')
    at validateUserId (C:\Users\Emi\Documents\express-review\middlewares\validateUserId.js:5:33)
    at Layer.handle [as handle_request] (C:\Users\Emi\Documents\express-review\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Emi\Documents\express-review\node_modules\express\lib\router\index.js:328:13)
    at C:\Users\Emi\Documents\express-review\node_modules\express\lib\router\index.js:286:9
    at Function.process_params (C:\Users\Emi\Documents\express-review\node_modules\express\lib\router\index.js:346:12)
    at next (C:\Users\Emi\Documents\express-review\node_modules\express\lib\router\index.js:280:10)
    at C:\Users\Emi\Documents\express-review\index.js:12:3
    at Layer.handle [as handle_request] (C:\Users\Emi\Documents\express-review\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (C:\Users\Emi\Documents\express-review\node_modules\express\lib\router\index.js:328:13)
    at C:\Users\Emi\Documents\express-review\node_modules\express\lib\router\index.js:286:9

看起来中间件会被所有后续路由(包括不带:userId参数的路由)调用,我确认中间件的导出导入正确,且放置在带/:userId参数的路由之前。将中间件放在路由内部(路径之后)时能正常工作,但我想找出当前写法的问题所在。

请问我哪里出错了?是否忽略了Express的内部机制?

已尝试的方案

  • 在中间件中先检查userId是否存在,但req.params始终为空对象,userId从未存在
  • 将路由移至单独文件并使用Router,问题仍存在
  • 添加morgan记录访问路由,记录正常,无路由匹配问题

内容的提问来源于stack exchange,提问作者Drake

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:50:26