javascript - 谷歌云函数: Why won't this work?

标签 javascript node.js google-cloud-functions

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

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

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

  • 我在 github 或 Google Cloud 文档中找到的示例,但无法正常工作

此语法不适用于 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

  • 我可以发现两种类型的语法,一种带有回调,一种带有 promise 链。

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

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

publisher.publish(data, attributes, callback);

我还看到了一些其他带有“ promise 链”技术的语法:

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

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

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

最佳答案

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

<强>1。 Destructuring (变量中的大括号)引发语法错误

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

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

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 作品。我建议与之前相同,共享完整的错误消息,创建一个新的云函数并尝试使用更简单的示例。我的云功能可以使用此功能:

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。为什么在“ promise 链”可用的情况下支持回调?这两种方法都有效吗?

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

另一个问题更多的是“回调与 promise ”问题。这始终是一个有趣的话题,但简短的总结是 promise 和回调不能直接互换。关于它们所做的事情,Promise 比回调要好得多,但不如回调那么适合通用目的。 Here's a very good writeup关于回调和 promise 。

关于javascript - 谷歌云函数: Why won't this work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53780975/

相关文章:

javascript - dev_prod_switch 未选取命令行变量

node.js - 使用 NPM 更新包时出错

javascript - Javascript 里没有 LIKE 语句吗?

javascript - 无法使用 Selenium 抓取 Web 数据

javascript - 由于右括号导致 PHP substr() 风格困惑

javascript - 将数据保存在数据库问题中,在控制台上收到 NULL

reactjs - Firebase 云函数压缩视频

firebase - 错误 : Wrap function is only available for `onCall` HTTP functions, 不是 `onRequest`

google-cloud-platform - Cloud Functions 中的 Google Identity Platform 身份验证

javascript - 幻灯片与 JavaScript 不工作