由于 json 的循环结构,我不断获得状态 500

Posted

技术标签:

【中文标题】由于 json 的循环结构,我不断获得状态 500【英文标题】:I keep getting status 500 because of Circular structure of json 【发布时间】:2019-09-09 09:47:00 【问题描述】:

我正在通过调用此 API 中的另一个 API 来创建微服务。其他 API 返回数据,但我不断收到此错误

这是付款响应成功:true,json:1(节点:31709) UnhandledPromiseRejectionWarning:TypeError:转换循环 结构为 JSON 在 JSON.stringify() 在 stringify (/Users/greatness/microservice/order/node_modules/express/lib/response.js:1119:12) 在 ServerResponse.json (/Users/alpha/setel/order/node_modules/express/lib/response.js:260:14) 在 router.post (/Users/alpha/setel/order/src/routes/order.js:59:21) 在 在 process._tickCallback (internal/process/next_tick.js:189:7) (node:31709) UnhandledPromiseRejectionWarning: 未处理的承诺 拒绝。此错误源于在异步内部抛出 没有 catch 块的函数,或者通过拒绝一个承诺 不使用 .catch() 处理。 (拒绝编号:2)

router.post("/order", async (req, res) => 

    let paymentResponse;

    // Im using Mongoose
    const order = new Order()

   try 
        // Call the payment API
        paymentResponse = await axios.post('http://localhost:3002/api/v1/payment', 
            order
        )

     catch (err) 

        res.status(500).json(
            success: false,
            message: err.message
        )
    

    console.log("This is payment Response", paymentResponse.data)

    // Success change the order status to confirmed
    if (paymentResponse.data.json === 0) 
        order.status = "confirmed"
     else 
        order.status = "declined"
    

    order.save()
    res.status(200).json(
        success: true,
        paymentResponse,
        order
    )
)

另一个只是返回正常的json

router.post("/v1/payment", async (req, res) => 

    try 


        // If 0 confirmed if 1 declined
        const randomResponse = Math.round(Math.random())
        res.status(200).json(
            success: true,
            json: randomResponse
        )

     catch (err) 
        res.status(500).json(
            success: false,
            message: err.message
        )
    
)

我能做什么?我不断获得状态 500。

问候。

【问题讨论】:

如何解决? @naga-elixir-jar 如果您想要发送给用户的响应中有任何信息,请提取该部分并发送。它是一个圆形结构的大物体 您的order 似乎不是POJO:因为它有.save(),我猜它还包含对数据库的引用,与它有关系的其他模型......你可以在那个兔子洞的任何地方都有一个循环引用。但是,您的问题或标签中没有任何内容表明您使用的是哪个 ORM,因此无法回答。 @naga-elixir-jar: paymentResponse 可能不能有循环引用,因为它是从 AJAX 调用重构的(除非 axios 在请求之后注入一些东西,或者响应是非-JSON 格式,允许循环引用,如 YAML)。 @Amadan 我正在使用猫鼬 【参考方案1】:

你打电话给json是这样的:

res.status(200).json(
    success: true,
    paymentResponse, <---
    order
)

paymentResponse 是来自 axios 的响应对象,这不是一个简单的 json,而是一个具有方法、属性和循环引用的复杂 JS 对象。 你想要做的是只发送这样的原始数据:

res.status(200).json(
    success: true,
    paymentResponse: paymentResponse.data, <--- Make sure the response from payment is valid json!
    order
)

【讨论】:

我猜应该是paymentResponse: paymentResponse.data

以上是关于由于 json 的循环结构,我不断获得状态 500的主要内容,如果未能解决你的问题,请参考以下文章

可以获得XML,但JSON丢掉500 [重复]

由于 JSON 较大,Ajax 导致 500 Internal Server Error

反序列化问题

Azure 函数状态码 500 内部服务器错误

高效遍历匹配Json数据,避免嵌套循环[转]

如何从SonarQube api获得500多个问题