尽管函数执行正确,但“将循环结构转换为 JSON”错误

Posted

技术标签:

【中文标题】尽管函数执行正确,但“将循环结构转换为 JSON”错误【英文标题】:"Converting circular structure to JSON" error despite functions being executed properly 【发布时间】:2020-03-04 07:45:36 【问题描述】:

我收到以下错误:

TypeError:将循环结构转换为 JSON

 at JSON.stringify (<anonymous>)
 at stringify (/usr/local/lib/node_modules/firebase-tools/node_modules/express/lib/response.js:1123:12)
 at ServerResponse.json (/usr/local/lib/node_modules/firebase-tools/node_modules/express/lib/response.js:260:14)
 at cors (/Users/landing-page-backend/functions/zohoCrmHook.js:45:43)
 at process._tickCallback (internal/process/next_tick.js:68:7)

对于我的 createLead 函数中的 HTTP 响应,尽管该函数已正确执行并且执行了它应该做的事情(即在我的 CRM 中创建一个条目)。

我已经在下面的代码中指出了错误发生的地方:

const axios = require('axios');
const functions = require('firebase-functions');
const cors = require('cors')( origin: true )

const clientId = functions.config().zoho.client_id;
const clientSecret = functions.config().zoho.client_secret;
const refreshToken = functions.config().zoho.refresh_token;
const baseURL = 'https://accounts.zoho.com';



module.exports = (req, res) => 
    cors(req, res, async () =>         
        const newLead = 
            'data': [
            
                'Email': String(req.body.email),
                'Last_Name': String(req.body.lastName),
                'First_Name': String(req.body.firstName),
            
            ],
            'trigger': [
                'approval',
                'workflow',
                'blueprint'
            ]
        ;
        
        const  data  = await getAccessToken();
        const accessToken = data.access_token;

        const leads = await getLeads(accessToken);
        const result = checkLeads(leads.data.data, newLead.data[0].Email);
        
        if (result.length < 1) 
            try 
                return res.json(await createLead(accessToken, newLead)); // this is where the error occurs
             catch (e) 
                console.log(e); 
            
         else 
            return res.json( message: 'Lead already in CRM' )
        
    )


function getAccessToken () 
    const url = `https://accounts.zoho.com/oauth/v2/token?refresh_token=$refreshToken&client_id=$clientId&client_secret=$clientSecret&grant_type=refresh_token`;
  
    return new Promise((resolve, reject) => 
      axios.post(url)
        .then((response) => 
          return resolve(response);
        )
        .catch(e => console.log("getAccessToken error", e))
    );


function getLeads(token) 
    const url = 'https://www.zohoapis.com/crm/v2/Leads';
  
    return new Promise((resolve, reject) => 
      axios.get(url, 
        headers: 
          'Authorization': `Zoho-oauthtoken $token`
        
      )
        .then((response) => 
          return resolve(response);
        )
        .catch(e => console.log("getLeads error", e))
    )

  
function createLead(token, lead) 
    const url = 'https://www.zohoapis.com/crm/v2/Leads';

    return new Promise((resolve, reject) => 
        const data = JSON.stringify(lead);
        axios.post(url, data, 
            headers: 
                'Authorization': `Zoho-oauthtoken $token`
            
        )
        .then((response) => 
            console.log("response in createLead", response)
            return resolve(response);
        )
        .catch(e => reject(e))
    )


function checkLeads(leads, currentLead) 
    return leads.filter(lead => lead.Email === currentLead)

Console.logging 所有参数都表明它们不是问题所在。 Zoho API 的配置也不是考虑到条目被正确地放入 CRM 的问题。我的假设是它与 JSON 格式的 HTTP 响应有关。

【问题讨论】:

【参考方案1】:

您正在尝试将promise 转换为JSON,但不起作用。您的createLead 函数返回promise,而不是JSONpromise 是“圆形对象”。

【讨论】:

即使我使用await,它是否仍然返回承诺? async 添加到afunction 会导致function 返回promiseawait 不会更改我们正在等待的函数的返回类型。

以上是关于尽管函数执行正确,但“将循环结构转换为 JSON”错误的主要内容,如果未能解决你的问题,请参考以下文章

“将循环结构转换为 JSON”来自 Cloud Function NodeJs 的 BigQuery 插入

未捕获(承诺中)TypeError:将循环结构转换为 JSON

JavaScript 异常:未捕获的类型错误:将循环结构转换为 JSON

如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”

VM1374:32 未捕获的类型错误:将循环结构转换为 JSON(…)

实现数据表时遇到错误-TypeError:将循环结构转换为 JSON