尽管函数执行正确,但“将循环结构转换为 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
,而不是JSON
。 promise
是“圆形对象”。
【讨论】:
即使我使用await
,它是否仍然返回承诺?
将async
添加到afunction
会导致function
返回promise
,await
不会更改我们正在等待的函数的返回类型。
以上是关于尽管函数执行正确,但“将循环结构转换为 JSON”错误的主要内容,如果未能解决你的问题,请参考以下文章
“将循环结构转换为 JSON”来自 Cloud Function NodeJs 的 BigQuery 插入
未捕获(承诺中)TypeError:将循环结构转换为 JSON
JavaScript 异常:未捕获的类型错误:将循环结构转换为 JSON
如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”