NodeJS:TypeError:将循环结构转换为JSON

时间:2018-05-22 14:42:56

标签: node.js express mongoose

我在Express中使用Node.js为CRUD操作制作了一个HTTP API。这部分有效,但当我发出GET请求时,会出现错误: TypeError: Converting circular structure to JSON。 其他HTTP方法(例如POSTDELETE)可以正常工作。

这是我的模特:

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所以执行了一个而不是我想要的。

3 个答案:

答案 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})时,就是导致循环错误的原因。