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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:09:01