【问题标题】:NodeJS: TypeError: Converting circular structure to JSONNodeJS:TypeError:将循环结构转换为 JSON
【发布时间】:2018-11-01 09:21:15
【问题描述】:

我在Node.js 中使用Express 创建了一个HTTP API,用于CRUD 操作。这部分有效,但是当我发出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);

编辑:

经过一番挖掘,我发现了问题所在,我有另一个函数有这个 url:/: skip/: talk所以它被执行了那个而不是我想要的。

【问题讨论】:

    标签: node.js express mongoose


    【解决方案1】:

    这是因为你不能序列化一个引用自身的对象。

    这是一个例子:

    const foo = {};
    foo.bar = foo
    

    在这里,我创建了一个名为foo 的对象。我添加了一个名为bar 引用foo 的属性。

    然后对象foo 不能再被序列化,因为它有一个无限的“属性树”。如果你使用我之前写的例子,这是完全有效的:

    foo.bar.bar.bar.bar.bar.bar.bar
    

    唯一的解决方案是手动提取您需要的值。你可以使用解构来简化这个过程。

    【讨论】:

    • 感谢您的回答,我明白这一点,但我看不到我在代码中的哪个位置引用了一个对象
    • @DmytoHolota 你能告诉我错误来自哪里吗?哪个文件和行,所以我可以检查源代码是否来自您正在使用的模块之一
    • 经过一番挖掘,我发现了问题所在,我有另一个函数有这个 url:`/:skip/:talk 所以它正在执行那个而不是我想要的。 面部护理。 @Seblor thx,为您提供帮助!
    • 啊,好吧。乐于助人:)
    【解决方案2】:

    当我必须将循环结构转换为 JSON 时,我使用了以下路线:

    route.post('/pay',async(req,res)=>{
    
      try {
        const link = 'https://app.sandbox.midtrans.com/snap/v1/transactions'
    
        const obj = {"transaction_details": {"order_id":"order-12","gross_amount": 5000}}
    
        const data = await axios.post(link,obj,
          { 
            headers : {
              "Accept": "application/json",
              "Content-Type": "application/json",
              Authorization: `Basic ${Base64.encode('*******')}`  
            }
          })
    
    
          const koin = data.data.token
          transaction.create({
            order_id : obj.transaction_details.order_id,
            gross_amount : obj.transaction_details.gross_amount,
            token : koin
          })
          console.log(data.data.token)
    
          res.json(data)
      } catch (error) {
        console.log(error)
      }
    
    })
    

    【讨论】:

    • @seblor 可以提供帮助
    • 由于某些原因,这解决了我的问题。
    【解决方案3】:

    我的问题是我在使用 async await 而在执行像 var result = await Product.find() 这样的猫鼬承诺时忽略了 await。当我忽略 await 时,它返回了一个承诺。

    所以当我执行res.send({result}) 时,这就是导致循环错误的原因。

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-31
      • 2018-10-05
      • 2016-01-22
      相关资源
      最近更新 更多