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

Node.js Express中URL参数为空问题求助:无法获取路由变量

Node.js Express API路径变量获取异常问题

问题现象

在Express应用中定义带URL变量的API路径后,无法获取到URL中的变量值。调用API时,路由处理函数里的req.params为空对象,且baseUrl和originalUrl显示的是路径模板而非实际请求的参数值。

相关代码

app.js

// app.js
const bodyParser = require('body-parser');
const express = require('express');
const addressRouter = require('./routes/address-router');
const http = require('http');

const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.set('port', 8081);

app.use((req, res, next) => {
  res.status(404).send({
    error: 'path not found',
  });
});

app.use('/v1/users/:userId/zip/:zipNumber/address', addressRouter);

const server = http.createServer(app);
server.on('error', onError);
server.on('listening', onListening);
server.listen(8081);

addressRouter.js

// addressRouter.js
const express = require('express');
const router = express.Router();

router.get('/zip-get', async (req, res, next) => {
  console.log('GET: /zip-get: req: ', req);
  res.send('Done');
});

module.exports = router;

调用的API命令

curl http://localhost:8081/v1/users/123-456/zip/1234567/address/zip-get

异常输出

在addressRouter.js中打印req时,得到:

params: {}

以及:

baseUrl: '/v1/users/:userId/zip/:zip/address',
originalUrl: '/v1/users/:userId/zip/:zip/address/zip-get',

更新信息

在请求对象中看到以下ReadableState字段,不确定是否表示请求未结束:

ReadableState {
objectMode: false,
highWaterMark: 16384,
buffer: BufferList { head: null, tail: null, length: 0 },
length: 0,
pipes: [],
flowing: null,
ended: false,
endEmitted: false,
reading: false,
sync: true,
needReadable: false,
emittedReadable: false,
readableListening: false,
resumeScheduled: false,
errorEmitted: false,
emitClose: true,
autoDestroy: false,
destroyed: false,
errored: null,
closed: false,
closeEmitted: false,
defaultEncoding: 'utf8',
awaitDrainWriters: null,
multiAwaitDrain: false,
readingMore: true,
dataEmitted: false,
decoder: null,
encoding: null,
[Symbol(kPaused)]: null
}

问题原因及解决方案

核心原因

中间件顺序错误:你把404响应中间件放在了路由挂载之前。Express按中间件定义顺序处理请求,请求到达后先被这个404中间件捕获并返回响应,后续的路由挂载代码根本不会执行。实际处理请求的是404中间件返回的假路由,自然无法解析URL参数。

解决方案

调整中间件顺序,将404中间件放到所有路由挂载之后:

修改后的app.js:

// app.js
const bodyParser = require('body-parser');
const express = require('express');
const addressRouter = require('./routes/address-router');
const http = require('http');

const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.set('port', 8081);

// 先挂载业务路由
app.use('/v1/users/:userId/zip/:zipNumber/address', addressRouter);

// 最后处理404请求
app.use((req, res, next) => {
  res.status(404).send({
    error: 'path not found',
  });
});

const server = http.createServer(app);
server.on('error', onError);
server.on('listening', onListening);
server.listen(8081);

关于ReadableState的疑问

这个字段是Node.js流的状态信息,和当前问题无关。ended: false仅表示请求流尚未结束,这是正常状态——在处理请求并发送响应前,流不会自动结束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 14:59:59