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

json-server做mock API测试时报循环结构转JSON错误如何解决

问题分析:json-server POST请求触发循环结构转JSON错误

错误触发原因

核心错误出现在/login接口的成功响应逻辑:

  • 你在认证通过后执行了res.status(200).json(res),直接将Express框架的响应对象res本身作为参数传给json()方法做序列化。res对象内部包含对请求对象req的引用,而req又反向关联了res,形成循环引用结构,JSON标准不支持序列化这种结构,因此直接抛出该错误。

另外代码中还存在三个隐性错误会导致后续运行异常:

  • 401响应分支中res.status(status)的status变量未定义,你定义的状态码是response对象的属性,不能直接读取status变量
  • 条件判断!isAuthenticated(req.body) === false写法冗余混乱,可读性极差
  • /user接口中参数定义为request和response,但代码中使用了未定义的req变量读取参数

修复方案

你可以根据业务需求调整返回内容,修正后的完整代码如下:

const jsonServer = require('json-server')
const server = jsonServer.create()
const router = jsonServer.router('./db.json')
const middlewares = jsonServer.defaults()
const db = require('./db.json');

server.use(middlewares)
server.get('/user', (req, res) => {
  // console.log('test');
  res.jsonp(req.query)
})

server.use(jsonServer.bodyParser)

const isAuthenticated = ({username,password})=>{
    return db.login.find(user => user.username === username && user.password === password)
}
server.post('/login', (req, res) => {
  const user = isAuthenticated(req.body)
  // 简化判断逻辑
  if (!user) {
    const response = {
      status : 401,
      message : 'Incorrect username or password'
    }
    // 直接传状态码,或者写response.status也可以
    return res.status(401).json(response)
  }
  // 返回业务数据,不要返回res对象本身,这里示例返回匹配到的用户信息
  res.status(200).json({
    status: 200,
    message: 'login success',
    user: user
  })
})

server.use(router)
server.listen(8000, () => {
console.log('JSON Server is running...')
})

主要修改点:

  • 登录成功分支不再返回res对象本身,替换为实际需要返回的业务数据
  • 修正401分支未定义的status变量问题
  • 简化条件判断逻辑,提升可读性
  • 修正/user接口的参数名不匹配问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:15:00