我正在尝试从我创建的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);
  });

});

最佳答案

通常,您的方法会起作用,并且您可以以与定义MyGCF相同的方式在getDay()处理程序内定义其他函数。但是,当前代码的一个问题是您忘记为MyGCF处理的请求“编写响应”。

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

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


关于您的代码,您可以在res.send()回调中使用.then()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);
    });

});

10-08 19:39