1
votes

I'm trying to use the '@google-cloud/bigquery' library to query BigQuery from a Google Cloud function. When the Promise returns, all I get back is an Array with another empty Array inside it, even though when I run the same query from the Big Query console I get a non-empty response back.

I've tried using an async function instead of a promise, but that was not successful. I also gave my Service Account "BigQuery Admin" and "Editor" privileges but that has not worked out either.

I do know the API is hitting Big Query. When I tried creating a new dataset from my Cloud Function, that call worked just fine, but for some reason I'm unable to get query results back from 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);
      });
    }
  }

I should get a JSON result object with values, but I only get and array with an empty array [[]]

3
What happens if you hard code country in your code? My thinking is to test a query by itself with minimal dependencies. - Kolban
@Kolban thats something I thought about too, but that doesn't seem to be the issue. When I hard code the country I get the same response. I've also tried querying a public dataset instead of my own and I still get no response. - Zak Ahmed
FYI, I too was experiencing this same issue (a nodejs cloud function>bigquery returning empty array). We too changed the package version (we upgraded to latest at the moment 4.1.2) and the problem disappeared. - xibalba1

3 Answers

2
votes

Please find a working example using a public dataset you can use to test your query with

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)
        }
    }
})
0
votes

i am now getting the same thing. I updated my cloud function without changing the code and the behavior changed.

0
votes

Taking into account your comments that downgrading google/bigquery to 1.3.X helped you resolve this. It seems to me that you may have been affected by this Issue. It looks like it was fixed in this merge, so you may be able to upgrade to the latest API version without re-introducing the error.