首页 > 解决方案 > 谷歌云功能:为什么这不起作用?

问题描述

我从使用 NodeJs 8 的 Google Cloud Functions 开始。(我也是 NodeJS 的新手,但不是 javascript)在浏览文档、github 上的示例、“旧”文章时我有点迷失了这个主题,我很沮丧无法取得一些体面的进展。

我的问题是:如果您能解释一下为什么某些语法不起作用:)

以下是目前让我感到困惑的一些事情:

此语法不适用于 Google Cloud Functions:您必须删除花括号才能使其正常工作。

取自此文档:https ://cloud.google.com/nodejs/docs/reference/pubsub/0.22.x/Publisher

const {PubSub} = require('@google-cloud/pubsub');

示例示例:https ://github.com/googleapis/nodejs-bigquery/blob/master/samples/tables.js

在同一个文档中,我阅读了回调技术:

https://cloud.google.com/nodejs/docs/reference/pubsub/0.22.x/Publisher

publisher.publish(data, attributes, callback);

我还看到了一些具有“承诺链”技术的其他语法:

https://cloud.google.com/nodejs/docs/reference/pubsub/0.22.x/

publisher.publish(data).then().catch()

两种方法都有效吗?我不明白为什么在“承诺链”可用的情况下支持回调?哪个最好用?(向后兼容?)

标签: javascriptnode.jsgoogle-cloud-functions

解决方案


我不确定问题来自“过时”或“错误”的文档,我相信问题来自其他地方。

1.解构(变量中的大括号)引发语法错误

我刚刚在 Node.js 8 Cloud Function 中自己尝试了您的示例,它正在工作。将 PubSub 库添加到 Cloud Function package.json 中,将您共享的行添加到代码中,并且可以正常工作。

您可以添加您收到的错误消息或尝试完全创建一个新的 Cloud Functions,因为您共享的语法绝对可以在 Cloud Functions 中使用。另外,尝试更简单的解构代码并检查它是否有效,例如:

exports.destructuringTest = (data, context) => {
  const complexObject = {simpleObject: "Hello"};
  const {simpleObject} = complexObject;

  console.log(simpleObject); // You should see "Hello" in the CF logs
};

2. 使用async关键字会引发语法错误

很奇怪,和第一个问题一样,我可以用我的async作品。我建议和以前一样,分享完整的错误消息,创建一个新的 Cloud Function 并尝试一个更简单的示例。我的云函数使用了这个:

exports.asyncTest= (data, context) => {
  function resolveAfter2Seconds() {
    return new Promise(resolve => {
      setTimeout(() => {
        resolve('resolved');
      }, 2000);
    });
  }

  async function asyncCall() {
    console.log('calling');
    var result = await resolveAfter2Seconds();
    console.log(result); // expected output: 'resolved'
  }

  asyncCall();

};

同样,在这种情况下您会收到语法错误,这很奇怪。如果我的建议不起作用,请尝试创建一个新项目(如果可能的话)并在那里测试示例。如果问题仍然存在,我的建议是使用Google 的问题跟踪器创建一个新问题,解释您的云功能发生了什么


3. 为什么有“promise chain”可用的回调支持?两种方法都有效吗?

publish方法允许将回调函数作为参数传递。如果您不传递回调函数,该方法会自动返回一个 Promise,所以是的,两种调用该方法的方式都有效。

另一个问题更像是“回调与承诺”的问题。这总是一个有趣的话题,但简要总结一下,promise 和 callbacks 不能直接互换。Promise 的作用比回调要好得多,但不如回调更适合通用目的。这是一篇关于回调和承诺的非常好的文章。


推荐阅读