使用json-server请求数组类型数据时无法读取URL参数是什么原因?
问题原因
该差异由json-server的内置路由逻辑直接导致:
- 当接口对应的db数据为对象类型时(你场景里的
slack_users_info2),json-server不需要做集合过滤,不会修改请求的查询参数,因此req.query可以在router.render回调中正常读取。 - 当接口对应的db数据为数组类型时(你场景里的
slack_users_info),json-server会默认把所有查询参数当作数组元素的过滤条件使用,处理完过滤逻辑后会主动清空req.query对象,因此你在渲染回调中读取对应参数就会返回undefined。
解决方法
在注册json-server路由前新增自定义中间件,提前把请求参数存储到不会被json-server修改的res.locals对象中即可,修改后的server.js参考代码:
const jsonServer = require('json-server') const server = jsonServer.create() const router = jsonServer.router(require('./db.js')()) const middlewares = jsonServer.defaults() server.use(middlewares) server.use(jsonServer.bodyParser) // 新增中间件,提前存储请求参数 server.use((req, res, next) => { res.locals.reqQuery = req.query res.locals.reqParams = req.params next() }) router.render = (req, res) => { // 从预存的位置读取参数即可 console.log("User try query: " + res.locals.reqQuery.user) console.log("User try param: " + res.locals.reqParams['user']) if (req.url.startsWith('/slack_users_info')) { res.jsonp({ user: res.locals.data }) } else if (req.url.startsWith('/slack_users_info2')) { res.jsonp({ user: res.locals.data }) } else { res.jsonp(res.locals.data) } } server.use(router) server.listen(port = 3000, () => { console.log('JSON Server is running') console.log('http://localhost:' + port) })
内容的提问来源于stack exchange,提问作者Rodrigo Vaamonde
相关产品推荐
相关产品推荐

