“将循环结构转换为 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。

你应该做的也是awaitinsertRowsAsStream的结果,假设包含函数也是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 插入的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

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

angularJs TypeError:将循环结构转换为JSON