Google云功能:为什么不起作用?

时间:2018-12-14 13:48:45

标签: javascript node.js google-cloud-functions

我从使用NodeJ 8的Google Cloud Functions开始。(我也是NodeJS的新手,但不是JavaScript的人) 浏览文档,github上的示例,关于该主题的“旧”文章时,我有些失落,而我无法取得一些体面的进展感到沮丧。

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

以下是一些目前困扰我的事情:

  • 我在github或Google Cloud文档中找到的示例,只是不能在OOTB中使用

此语法不适用于Google Cloud Functions:必须删除花括号以使其起作用。

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

const {PubSub} = require('@google-cloud/pubsub');
  • NodeJS8应该支持 async 关键字,该关键字在我在Github上找到的示例中使用,并且在选择Node8时保存函数时出现语法错误。

示例示例: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()

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

1 个答案:

答案 0 :(得分:1)

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

1。 Destructuring(在变量中使用大括号)会引发语法错误

我刚刚在Node.js 8 Cloud Function中尝试了您的示例,并且该示例正在运行。将PubSub库添加到Cloud Function package.json中,将共享的行添加到代码中,并且行得通。

您可以添加接收到的错误消息,或者尝试完全创建一个新的Cloud Function,因为共享的语法绝对可以在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并尝试一个更简单的示例。我的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's Issue Tracker创建一个new issue来解释您的Cloud Functions发生的情况


3。为什么可以使用“承诺链”来支持回调?两种方法都可行吗?

publish method允许将回调函数作为参数传递。如果不传递回调函数,则该方法会自动返回promise,因此,是的,两种调用该方法的方法都可以使用。

另一个问题更多是“回调与承诺”问题。这始终是一个有趣的话题,但是简短的总结是,promise和回调不能直接互换。关于回调函数,Promise比回调要好得多,但是不像回调那样适合一般用途。 Here's a very good writeup关于回调和承诺。