“将循环结构转换为 JSON”来自 Cloud Function NodeJs 的 BigQuery 插入
Posted
技术标签:
【中文标题】“将循环结构转换为 JSON”来自 Cloud Function NodeJs 的 BigQuery 插入【英文标题】:"Converting circular structure to JSON" BigQuery Insert from Cloud Function NodeJs 【发布时间】:2020-04-14 20:28:22 【问题描述】:我正在尝试从用 NodeJs 编写的 Cloud Function 将 json 对象数组加载到 BigQuery 表。我收到错误“将循环结构转换为 JSON,尽管我没有任何循环引用。我的代码如下所示。
我有一个可以调用的函数
var num_rows = insertRowsAsStream(data);
res.status(200).send(num_rows);
inserRowsAsStream 函数是
async function insertRowsAsStream(data)
// Inserts the JSON objects into my_dataset:my_table.
// Create a Client
const bigQuery = new BigQuery(projectID: 'myProject');
const datasetId = 'test_data';
const tableId = 'temp';
const rows = data;
// Insert data into a table
await bigQuery
.dataset(datasetId)
.table(tableId)
.insert(rows);
return rows.length ;
传递给 insertRowsAsStream 的数据参数是格式。任何地方都没有循环引用。
[ "name": "John Doe", "age": 30, "title": "Director", "name": "Jane Doe", "age": 27, "title": "Manager" ]
【问题讨论】:
【参考方案1】:虽然您的函数似乎返回了rows.length
,但它实际上返回了一个解析为rows.length
值的Promise。这是因为insertRowsAsStream
被声明为async
,并且所有async
函数都返回一个Promise。
你应该做的也是await
insertRowsAsStream的结果,假设包含函数也是async
:
var num_rows = await insertRowsAsStream(data);
res.status(200).send(num_rows);
您可能还想考虑发送除数字以外的其他内容。也许是调用者可以轻松解析的 JSON 对象:
res.json( numRows: num_rows )
这将允许您通过添加新属性来更改响应,而不会破坏现有客户端。
【讨论】:
感谢您解决了问题。我在 insertRowsAsStream 之前添加了 await 并且也更改为 res.json 但是为什么错误提到“将循环结构转换为 JSON”,而它与等待有关。我正在使用内联编辑器编写云函数,它不显示抛出错误的行号。如何在内联编辑器中调试代码?以上是关于“将循环结构转换为 JSON”来自 Cloud Function NodeJs 的 BigQuery 插入的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 异常:未捕获的类型错误:将循环结构转换为 JSON
如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”
VM1374:32 未捕获的类型错误:将循环结构转换为 JSON(…)