2014-09-02 71 views
1

我想使用google-api-nodejs-clientstream rowsGoogle BigQuery如何使用Nodejs将插入流式传输到BigQuery?

挖进source code我发现我需要一个“资源”参数。我试了几个组合,去的apirequest的来源,但我总是得到错误No rows present in the request.

我终于成功地在与另一npm module每次上载一行但该模块不支持tabledata.insertAll()。

你能举一个例子说明如何使用“资源”参数来插入数据流吗?

bigquery.tabledata.insertAll({ 
    auth: oauth2Client, 
    'projectId': config.google.projectId, 
    'datasetId': config.google.datasetId, 
    'tableId': config.google.tableId, 
    'resource ': { 
    "kind": "bigquery#tableDataInsertAllRequest", 
    "rows": [ 
     { 
     "insertId": 123456, 
     "json": '{"id": 123,"name":"test1"}' 
     } 
    ] 
    } 
}, function(err, result) { 
    if (err) { 
    return console.error(err); 
    } 
    console.log(result); 
}); 
+0

显然,BigQuery的NPM模块支持流媒体刀片通过调用bigquery.job.load()。我还是想不过使用官方模块。 – pcoucke 2014-09-02 08:13:41

+0

有没有一种方法来打印实际的HTTP请求那正在发送? – 2014-09-02 16:34:51

+0

我无法在模块中找到任何设置来启用此设置。而Wireshark在这里也无法帮到我。 – pcoucke 2014-09-04 13:14:37

回答

3

你有资源后进行额外的空间,你有没有试着删除。是什么?

'resource ': { 
+1

非常感谢!这是问题,再加上Jordan Tigani发现的JSON的双重编码。我应该亲眼看到这个... – pcoucke 2014-09-08 08:02:51

2

它看起来像你正在做插入行的额外编码。它们应该作为原始json发送,而不是将整行编码为字符串。也就是说,这样的事情:

'rows': [ 
    { 
    'insertId': 123456, 
    'json': {'id': 123,'name':'test1'} 
    } 
] 

(注意,从你上面什么是公正的{'id': 123,'name':'test1'}线没有报价的差异

+0

感谢您的建议。 我也试过这个,但是这给出了同样的错误。查看https://github.com/google/google-api-nodejs-client/blob/master/lib/apirequest.js#L102,在“资源”被考虑之前,似乎需要“媒体”参数。我尝试了几种组合,甚至是一个虚拟的“mediaUrl”参数和“media.body”,但仍然是相同的错误。 – pcoucke 2014-09-04 12:51:51

+0

我发现这是问题,以及“资源”之后的空间。非常感谢您的帮助!在尝试了其他几件事情之后,我尝试了这种双重编码,并忘记再次将其删除。 – pcoucke 2014-09-08 08:04:15

相关问题