我正试图从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的数据arg的格式为。任何地方都没有循环引用。
[ {"name": "John Doe", "age": 30, "title": "Director"}, {"name": "Jane Doe", "age": 27, "title": "Manager"} ]
虽然函数看起来返回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 })
这将允许您通过添加新属性来更改响应,而不会破坏现有客户端。