【发布时间】: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