@ google-cloud / bigquery查询API在Cloud Function中使用时返回空的Promise

时间:2019-05-28 02:25:06

标签: google-bigquery google-cloud-functions google-api-nodejs-client

我正在尝试使用'@ google-cloud / bigquery'库从Google Cloud函数查询BigQuery。当Promise返回时,我得到的只是一个包含另一个空数组的Array,即使当我从Big Query控制台运行相同的查询时,也得到了一个非空的响应。

我尝试使用异步函数代替Promise,但这并不成功。我还为我的服务帐户赋予了“ BigQuery Admin”和“ Editor”特权,但这两种方法都没有解决。

我确实知道API达到了“大查询”水平。当我尝试通过Cloud Function创建新数据集时,该调用工作正常,但由于某种原因,我无法从BQ获取查询结果。

  function warningAndPreventionIntent(agent) {
    let userCountry = agent.parameters['geo-country'];
    console.log(String(userCountry[0]));

    const gotCountry = userCountry.length > 0;

    if(gotCountry) {
      agent.add('Im looking into your trip');

      const OPTIONS = {
              query: 'SELECT disease.name FROM `projectId.dataset.table`, unnest(disease) disease WHERE country = @country',
              timeoutMs: 10000,
              useLegacySql: false,
              params: {country: userCountry[0]}
      };

      return bigquery
      .query(OPTIONS)
      .then(results => {
          console.log(JSON.stringify(results[0]))
          const ROWS = results[0];

          let diseaseList = [];

          for(var row of ROWS) {
            diseaseList.push(row.name);
            console.log(diseaseList);
          }

          return true;

      })
      .catch(err => {
        console.error('ERROR:', err);
      });
    }
  }

我应该获得一个带有值的JSON result对象,但是我只获取和包含一个空数组[[]]的数组

3 个答案:

答案 0 :(得分:2)

请使用公共数据集找到一个有效的示例,您可以使用该数据集测试您的查询

if (!global._babelPolyfill) {
    var a = require("babel-polyfill")
}

import BigQuery from '@google-cloud/bigquery'

describe('Check google-cloud', async () => {

    it('Test query', async () => {
        let result = await test('panada')

    })

    async function test(p1) {
        try {
            const bigquery = new BigQuery({
                projectId: `projectId`,
                keyFilename: '/Users/tamirklein/ssh/mydata.json'
            })

            let query = [
                'SELECT url',
                'FROM `publicdata.samples.github_nested`',
                'WHERE repository.owner = @owner'

            ].join(' ')

            console.log(`query is: ${query}`)
            let [result] = await bigquery.query({
                query,
                params: {
                    owner: p1
                }
            })

            result.forEach((row, index) => {
                console.log(`row number ${index}, url is: ${row.url}`)
            })
        } catch (err) {
            console.log("err", err)
        }
    }
})

答案 1 :(得分:0)

我现在正在得到同样的东西。我在不更改代码的情况下更新了云功能,并且更改了行为。

答案 2 :(得分:0)

考虑到您的评论,这些评论将google / bigquery降级为1.3.X可以帮助您解决此问题。在我看来,您可能已受this Issue的影响。 merge中似乎已修复此问题,因此您可以升级到最新的API版本,而无需重新引入错误。