首页 > 解决方案 > 将参数从 Google Cloud 函数 GET 请求传递到 BigQuery

问题描述

我已经成功部署了一个从 POST 请求中接收参数的谷歌云函数。我现在正在尝试将其更改为从 GET 请求中获取参数,因为参数不包含任何私有数据。

似乎我正确地获取了传入的参数,但是当我尝试将它们传递给 bigQuery 时,它告诉我我的查询缺少参数。我知道我的代码是正确的,因为如果我对参数的值进行硬编码,它可以正常工作,例如:

bigQuery.createQueryJob({
    query,
    params: {
    "make": "acura",
    "model": "mdx",
    "modelYear": 2005
}
}).then...

我也知道我得到了正确的参数,因为如果我将我的云函数更改为只返回传入的查询字符串参数,它会正确返回它们(下面注释掉的行)。如果我将云功能更改为使用 req.body 而不是 req.query 并使其成为 POST 请求,它也可以正常工作。

我不知道为什么“参数”没有正确传递给 createQueryJob。任何帮助将非常感激。这是代码(出于隐私原因,我不得不删除实际查询):

包.json:

{
    "name": "sample-http",
    "version": "0.0.1",
    "dependencies": {
        "@google-cloud/bigquery": "^2.0.6"
    }
}

index.js:

const { BigQuery } = require("@google-cloud/bigquery");

/**
 * Responds to any HTTP request.
 *
 * @param {!express:Request} req HTTP request context.
 * @param {!express:Response} res HTTP response context.
 */
exports.getRecallDataByVehicleInfo = (req, res) => {
    res.set('Access-Control-Allow-Origin', "*");
    res.set('Access-Control-Allow-Methods', 'GET, POST');
    res.setHeader(
        "Access-Control-Allow-Headers",
        "X-Requested-With,content-type"
    );

    const params = req.query;
   // res.status(200).send("make is - " + params.make + ", model is - " + params.model + ", model year is -" + params.modelYear);
   // return;

    const bigQuery = new BigQuery();

    const query = `myQuery
        where Make = @make
        and Model = @model
        and ModelYear = @modelYear`

    bigQuery.createQueryJob({
        query,
        params
    }).then(results => {
        const job = results[0];
        return job.getQueryResults({
            autoPaginate: false,
            timeoutMs: 1000000
        }, 
        callback());
    });

    const callback = () => (err, rows) => {
        if (err) {
            res.status(401).send(JSON.stringify(err));
        }
        else {
            res.status(200).send(rows);
        }
    };
}

标签: node.jsgoogle-bigquerygoogle-cloud-functions

解决方案


你没有使用正确的方法。看看createQueryJob定义

没有参数,它用于将查询创建为作业。如果您查看官方(坏)示例,则必须使用query方法。这里它的定义

注意:为什么这个例子不好?

在官方示例中,提供给该query方法的参数名为option。在该query方法的文档中,第一个(也是必需的)参数命名为query,您可以选择添加一个option参数。所以,命名是混乱的。


推荐阅读