【问题标题】:Calling a Promise function inside Google Cloud Function在 Google Cloud 函数中调用 Promise 函数
【发布时间】:2019-03-11 22:37:52
【问题描述】:

我正在尝试从我创建的 Google Cloud Function (GCF) 向另一个 Web 服务发出 HTTP 请求。我需要 HTTP 请求来完成并在我的 GCF 中返回该结果,以便我可以用它做其他事情。

我的问题是;在 Google Cloud Function 中使用 Promise 的最佳方式是什么?我正在尝试做的事情可能吗?

我的代码目前如下所示:

export const MyGCF = functions.https.onRequest((request, response) => {

  let dayOfTheWeek: any;

  const request1 = require('request');
  const url = 'http://worldclockapi.com/api/json/pst/now';
  function getDay() {
    return new Promise((resolve, reject) => {
        request1(url, { json: true }, (err: any, res: any, body: any) => {
            if (err) {
                return reject(err);
            }
            resolve(body.dayOfTheWeek);
        });
    });
  }

  getDay().then((data) => {
      dayOfTheWeek = data;
      console.log(dayOfTheWeek);
  });

});

【问题讨论】:

  • 是的,有可能。您可以在函数中编写任意代码。但是您实际上永远不会使用 response.send() 或任何等效项将响应发送回客户端,因此此函数总是会超时。
  • 谢谢 Doug.. 我能得到一个代码示例吗?我对如何写一个感到困惑。
  • "我不确定我是否可以在谷歌云函数中拥有多个函数。" - 是的,你可以
  • 如果您对如何为 Cloud Functions 编写代码感到困惑,您应该从文档开始。 firebase.google.com/docs/functions
  • 我知道如何为云函数编写代码,但我不知道如何在 CF 中编写 promise 函数调用。我找不到代码示例,并且在我的代码编辑器中出现错误。所以我正在寻找简单的例子

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


【解决方案1】:

一般来说,您的方法是可行的,您可以在 MyGCF 处理程序中定义其他函数,方法与定义 getDay() 的方式相同。但是,您当前代码的一个问题是您忘记为MyGCF 正在处理的请求“编写响应”。

您可以通过在 MyGCF 请求处理程序的第二个 res 参数上调用 send() 来为请求编写响应。一个简单的例子是:

/* Sends a response of "hello" for the request */
res.send("hello");

关于您的代码,您可以在.then() 回调中使用res.send()getDay() 完成后将响应发送回客户端(参见下面的代码)。还要注意包括.catch() 子句和错误情况的回调(带有错误状态),以确保在对getDay() 的调用失败时客户端收到适当的错误响应:

export const MyGCF = functions.https.onRequest((req, res) => {

  const request = require('request');
  const url = 'http://worldclockapi.com/api/json/pst/now';

  function getDay() {
    return new Promise((resolve, reject) => {
      request(url, {
        json: true
      }, (err: any, r: any, body: any) => {
        if (err) {
          reject(err);
        } else {
          resolve(body.dayOfTheWeek);
        }
      });
    });
  }

  getDay().then((dayOfTheWeek) => {
      /* Send a response once the getDay() request complete */
      res.send(dayOfTheWeek);
    })
    .catch(err => {
      /* Don't forget the error case */
      res.status(500).send(err);
    });

});

【讨论】:

    猜你喜欢
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多