【问题标题】:Express Middleware: ERROR: TypeError: Converting circular structure to JSONExpress 中间件:错误:TypeError:将循环结构转换为 JSON
【发布时间】:2019-08-25 10:45:32
【问题描述】:

我使用以下函数作为中间件只是为了增加添加到我的数组中的新对象的 id:

let lions = []
let id = 0

const updateId = function(req, res, next) {
  if (!req.body.id) {
    id++;
    req.body.id = id + '';
  }
  next();
};

当我发布一只新狮子时,它会到达这条路线:

app.post('/lions', updateId, (req, res) => {
  console.log('POST req', req.body)
  const lion = req.body;
  lions.push(lion)

  res.json(req)
})

POST 工作正常,新狮子已创建,但出现以下错误。关于如何解决它的任何想法?

[nodemon] 开始 node server.js 节点在端口上运行:3000 获得狮子:[] 错误:TypeError:将循环结构转换为 JSON 在 JSON.stringify() 在 stringify (/Users/leongaban/projects/tutorials/pluralsight/api-design-node/node_modules/express/lib/response.js:1119:12)

server.js

// create a route middleware for POST /lions that will increment and
// add an id to the incoming new lion object on req.body

const express = require('express')
const app = express()
const bodyParser = require('body-parser')
const port = 3000

app.use(express.static('client'))
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())

let lions = []
let id = 0

const updateId = function(req, res, next) {
  if (!req.body.id) {
    id++;
    req.body.id = id + '';
  }
  next();
};

app.param('id', (req, res, next, id) => {
  let lion = lions.filter((lion => lion.id === id))

  if (lion) {
    req.lion = lion;
    next();
  }
  else {
    console.log('NO LION')
    res.send()
  }
})

app.get('/lions', (req, res, next) => {
  console.log('GET lions:', lions)
  res.json(lions)
})

app.get('/lions/:id', (req, res) => {
  res.json(req || {})
})

app.post('/lions', updateId, (req, res) => {
  console.log('POST req', req.body)
  const lion = req.body;
  lions.push(lion)

  res.json(req)
})

app.put('/lions/:id', (req, res) => {
  const paramId = req.params.id
  const updated = req.body

  if (updated.id) delete updated.id

  const oldLion = lions.find((lion => lion.id === paramId))

  if (!oldLion) res.send()

  const newLion = Object.assign({ id: oldLion.id }, updated)
  lions = lions.filter(lion => lion.id !== paramId)
  lions.push(newLion)

  res.json(newLion)
})

app.delete('/lions/:id', (req, res) => {
  lions = lions.filter((lion => lion.id !== req.params.id))

  res.json(lions)
})

app.use((err, req, res, next) => {
  console.error('ERROR:', err)
})

app.listen(port, () => console.log(`NODE RUNNING on port: ${port}`))

【问题讨论】:

  • 可能是因为在这一行:res.json(req)app.post() 方法中,req 对象包含引用外部属性的内部属性,从而创建循环引用。使用console.log() 检查该对象的结构,或者如果您在响应中返回其他内容,也许可以避免该问题。
  • @Shidersz 你是对的,发布了我为解决问题所做的工作,但你想发布你的答案吗?我会检查的。
  • 抱歉,在您提供的上下文中,我没有看到明确的方法来回答这个问题。不过,我很高兴可能问题的假设对您有所帮助。

标签: javascript node.js express


【解决方案1】:

可能是因为在这一行: app.post() 方法的 res.json(req) 中,req 对象包含引用外部属性的内部属性,因此创建了循环引用。使用 console.log() 检查该对象的结构,或者如果您在响应中返回其他内容,也许可以避免该问题。

– 施德兹

需要在传入put函数的res.json之前创建一个新变量

app.param('id', (req, res, next, id) => {
  let lion = lions.filter((lion => lion.id === id))
  
  if (lion) {
    req.lion = lion;
    next();
  } else {
    res.send();
  }
})

app.get('/lions', (req, res, next) => {
  console.log('GET lions:', lions)
  res.json(lions)
})

app.get('/lions/:id', (req, res) => {
  console.log('GET lion:', req.lion)
  const lion = req.lion // <-- here
  res.json(lion || {})  // <-- then here instead of passing req
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 2021-10-23
    • 1970-01-01
    • 2015-07-26
    • 2018-10-05
    相关资源
    最近更新 更多