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

