我在Express
中使用Node.js
为CRUD操作制作了一个HTTP API。这部分有效,但当我发出GET
请求时,会出现错误:
TypeError: Converting circular structure to JSON
。
其他HTTP方法(例如POST
和DELETE
)可以正常工作。
这是我的模特:
const mongoose = require('mongoose');
const coment = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
text: {type: String, required: true},
author_coment: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
date: {type: Date, default: Date.now}
});
const vote = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
author_vote: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
vote: {type: Boolean, required: true},
date: {type: Date, default: Date.now}
})
const book = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
title: {type: String, required: true},
author: {type: mongoose.Schema.Types.ObjectId, ref: 'User'},
sinopsis: {type: String, required: true},
text: {type: mongoose.Schema.Types.ObjectId, ref: 'Text'},
creation_date: {type: Date, default: Date.now},
cover: {type: String},
coments: [coment],
votes: [vote]
});
module.exports = mongoose.model('Book', book);
这是我的GET
功能:
// [GET: Book info]
router.get('/info/:book_id', function (req, res) {
Book.findById(req.params.book_id, (err, book) => {
if (err) return res.status(500).send(err);
res.status(200).send(book);
});
});
这是我的用户模型:
const mongoose = require('mongoose');
const user = mongoose.Schema({
_id: mongoose.Schema.Types.ObjectId,
name: {type: String, required: true},
email: {type: String, required: true},
password: {type: String, required: true}
});
module.exports = mongoose.model('User', user);
编辑:
经过一番挖掘,我发现问题是什么,我有另一个有这个网址的函数:/: skip/: talk
所以执行了一个而不是我想要的。
答案 0 :(得分:2)
这是因为您无法序列化对其自身有引用的对象。
以下是一个例子:
const foo = {};
foo.bar = foo
在这里,我创建了一个名为foo
的对象。我添加了一个名为bar
的属性,引用foo
。
然后对象foo
不能再序列化,因为它有一个无限的属性树"。如果你使用我之前写的例子,这是完全有效的:
foo.bar.bar.bar.bar.bar.bar.bar
唯一的解决方案是手动提取您需要的值。您可以使用解构来简化流程。
答案 1 :(得分:1)
当我不得不将循环结构转换为JSON时,我使用了以下路由:
right
答案 2 :(得分:1)
我的问题是我在使用async await
时曾做过await
的猫鼬承诺,却忽略了var result = await Product.find()
。当我离开await
时,它返回了一个诺言。
所以当我做res.send({result})
时,就是导致循环错误的原因。