云功能中的间歇性身份验证错误

时间:2017-08-28 16:34:49

标签: javascript google-bigquery google-cloud-functions

我有一个简单的Cloud Function接收webhook,然后在BigQuery中进行流式插入。代码基于此sample(除了我正在使用流式插入)

exports.webHook = function webHook (req, res) {
  return Promise.resolve()
    .then(() => {
      if (req.method !== 'POST') {
        const error = new Error('Only POST requests are accepted');
        error.code = 405;
        throw error;
      }

      const events = req.body || {};
      if (events) {
        const opts = { ignoreUnknownValues: true };
        bigquery
          .dataset('config.DATASET')
          .table('config.TABLE')
          .insert(events, opts)
          .then((data) => {
            console.log(`Success: ${JSON.stringify(data[0])}`);
          })
          .catch((error) => {
            if (error.name === 'PartialFailureError') {
              console.error(`PARTIAL ERROR: ${JSON.stringify(error)}`);
              } else {
              console.error(`OTHER ERROR: ${JSON.stringify(error)}`);
            }

          });
      };
    })
    .then(() => res.status(200).end())
    .catch((err) => {
      console.error(err);
      res.status(err.code || 500).send(err);
      return Promise.reject(err);
    });
};

这个功能在大多数情况下运行良好,但我偶尔会遇到身份验证错误,然后就会消失。 enter image description here

  

textPayload :“其他错误:{”代码“:401,”错误“:[{”message“:”请求   有无效的身份验证凭据预期的OAuth 2访问令牌,   登录cookie或其他有效的身份验证凭据。看到   https://developers.google.com/identity/sign-in/web/devconsole-project “” 域 “:” 全局 “ ”理由“: ”未授权“}], ”消息“:” 请求   有无效的身份验证凭据预期的OAuth 2访问令牌,   登录cookie或其他有效的身份验证凭据。看到   https://developers.google.com/identity/sign-in/web/devconsole-project。 “}”

我不确定auth是如何成为问题的,因为Cloud Function和BigQuery都在同一个项目中。

1 个答案:

答案 0 :(得分:1)

Cloud Functions团队的人认为这可能是由于访问令牌生存时间(TTL)的问题,并提出了一个对我有用的解决方法。而不是在代码顶部初始化BigQuery(就像他们的所有示例都有),将初始化代码放在调用函数内部。

这样做:

exports.webHook = function webHook (req, res) {
  const bigquery = require('@google-cloud/bigquery')();
  return Promise.resolve()
    .then(() => {
      if (req.method !== 'POST') {
        const error = new Error('Only POST requests are accepted');
        error.code = 405;
        throw error;
      }
      .
      .

而不是:

const bigquery = require('@google-cloud/bigquery')();
.
.
exports.webHook = function webHook (req, res) {
      return Promise.resolve()
        .then(() => {
          if (req.method !== 'POST') {
            const error = new Error('Only POST requests are accepted');
            error.code = 405;
            throw error;
          }
          .
          .