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

