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
相关产品推荐
相关产品推荐

