Express中间件传递参数至路由失效,求助排查方案
Express路由传递参数失败的解决办法
问题场景
尝试向Express路由传递自定义参数,在app.use的中间件中设置了req.params,但路由文件中读取时发现参数丢失,req.params为空对象。
复现代码
server.js
const app = express(); app.use(express.json()); app.use(cors()); app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()); const fooRouter= require('./routes/foo'); const stringVar = 'some string'; app.use('/foo', function (req, res, next) { req.params = { connect: stringVar, }; console.log(req.params); // 打印出正确的值 next(); }, fooRouter);
routes/foo.js
const express = require('express'); const path = require('path'); const router = express.Router(); router.get("/", (req, res) => { const parameters = req.params; console.log(req.params); // 打印空对象 -> parameters.connect 未定义 console.log("string: ", parameters.connect); } module.exports = router;
问题原因
你直接覆盖了req.params对象,而Express在路由匹配过程中,会重新生成req.params来匹配URL中的路径参数,导致你之前设置的内容被清空。
可行解决方案
方案1:给req.params追加属性
不要直接替换整个req.params对象,而是给它添加自定义属性:
// server.js中的中间件修改为 app.use('/foo', function (req, res, next) { req.params.connect = stringVar; console.log(req.params); next(); }, fooRouter);
方案2:使用req.locals存储(Express推荐)
req.locals是Express专门用来存储请求级自定义变量的字段,不会和内置属性冲突:
// server.js app.use('/foo', function (req, res, next) { req.locals.connect = stringVar; next(); }, fooRouter); // routes/foo.js中读取 router.get("/", (req, res) => { console.log(req.locals.connect); // 输出'some string' });
方案3:直接给req添加自定义属性
如果不想和内置字段混淆,也可以直接给req对象新增一个自定义属性:
// server.js app.use('/foo', function (req, res, next) { req.connect = stringVar; next(); }, fooRouter); // routes/foo.js中读取 router.get("/", (req, res) => { console.log(req.connect); // 输出'some string' });
内容的提问来源于stack exchange,提问作者onomatopoeia_truck
相关产品推荐
相关产品推荐

