【问题标题】:How to send a HTTP request from Google Cloud Functions (nodeJS)如何从 Google Cloud Functions (nodeJS) 发送 HTTP 请求
【发布时间】:2017-10-31 19:26:40
【问题描述】:

这可能是一个简单的问题,但我是云功能/节点编程的新手,还没有找到合适的文档。

如何编写一个接收 HTTP 请求但随后将 HTTP 请求发送到不同端点的 Google 云函数?例如,我可以将 HTTP 触发器发送到我的云函数 (https://us-central1-plugin-check-xxxx.cloudfunctions.net/HelloWorldTest)。在项目的后期,我将弄清楚如何实现延迟。但后来我想用一个新的 HTTP 请求响应另一个端点 (https://maker.ifttt.com/trigger/arrive/with/key/xxxx)。我怎么做?

exports.helloWorld = function helloWorld(req, res) {
  // Example input: {"message": "Hello!"}
  if (req.body.message === undefined) {
    // This is an error case, as "message" is required.
    res.status(400).send('No message defined!');
  } else {
    // Everything is okay.
    console.log(req.body.message);
    res.status(200).send('Success: ' + req.body.message);
    // ??? send a HTTP request to IFTTT endpoint here
  }
};

【问题讨论】:

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


    【解决方案1】:

    使用https://www.npmjs.com/package/request 模块。

    var request = require('request');
    request.get('https://maker.ifttt.com/trigger/arrive/with/key/xxxx', function (error, response, body) {
      console.log('error:', error); // Print the error if one occurred 
      console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received 
      console.log('body:', body); //Prints the response of the request. 
    });
    

    【讨论】:

    • 感谢您为我指明正确的方向。我能够让云功能正常工作。最终版本发布
    【解决方案2】:

    这是我在 Chetan Kanjani 的帮助下设法获得的代码。当我向我的 Google Cloud 函数端点发送一条短信时,它会回复一条短信给 IFTTT(另一个端点)。

    const request = require('request');
    
    exports.helloWorld = function helloWorld(req, res) {
      // Example input: {"message": "Hello!"}
      if (req.body.message === undefined) {
        // This is an error case, as "message" is required.
        res.status(400).send('No message defined!');
      } else {
        // Everything is okay.
        console.log(req.body.message);
    
        request.get('https://maker.ifttt.com/trigger/arrival/with/key/xxxx', function (error, response, body) {
          console.log('error:', error); // Print the error if one occurred 
          console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received 
          console.log('body:', body); //Prints the response of the request. 
        });
        res.status(200).send("Success");
      }
    };
    

    我还必须更改 package.json 文件以包含请求包。它已经有了 sample-http 包,我添加了依赖项:

    {
      "name": "sample-http",
      "version": "0.0.1",
      "dependencies": {
        "request": "^2.81.0"
      }
    }
    

    我仍然不确定 console.log 函数在哪里打印信息。这可能对将来的调试有所帮助。

    【讨论】:

    • 日志转到谷歌云日志console.cloud.google.com/…
    • 只是留下一个说明这对我有用,但我不得不等待几分钟才能安装请求模块。我收到错误提示找不到模块,所以我想在后台发生了一个 npm 安装程序进程。几分钟后就好了。
    • 2020 年的消息:这个答案救了我!几天来一直在敲击键盘,试图让 pub/sub 发送一个 GET 请求(我猜它不会),并了解到有一个模块可以让 Firebase 为我 GET !现在我明白了。
    • 仅供参考,request 模块已于 2020 年弃用
    【解决方案3】:

    请求模块使用回调。如果你想改用 JavaScript Promise,Axios 模块提供了等效的功能。

    【讨论】:

    • request 模块已于 2020 年 2 月弃用
    【解决方案4】:

    旧的,但我在搜索自己时遇到了这个:

    支持 promise 的请求模块是 (request-promise)

    【讨论】:

      【解决方案5】:

      下面的代码有效。不确定 Axios 是否是此类简单请求的理想模块,但 Google Cloud Function 文档使用 Axios,因此也使用 Axios 似乎是明智的。其他答案使用 request 模块,但已于 2020 年 2 月弃用。

      注意:GCF 目前不支持 ES6。 ES6 支持随 Node 13 一起提供。

      Package.json

      {
        "name": "YOUR_NAME",
        "version": "0.0.1",
        "dependencies": {
          "axios": "^0.19.2"
        }
      }
      

      Index.js

      /**
       * Required Modules
       */
      const axios = require("axios");
      
      
      /**
       * Responds to any HTTP request.
       *
       * @param {!express:Request} req HTTP request context.
       * @param {!express:Response} res HTTP response context.
       */
      exports.run = async(req, res) => {
        // Set API end point.
        let apiURL = YOUR_URL;
      
        // Wrap API parameters in convenient object.
        let apiData = {
          PARAM_1: PARAM_DATA,
          PARAM_2: PARAM_DATA
        };
      
        // Invoke API.
        axios.post(apiURL,
          JSON.stringify(apiData)
        )
        .then((response) => {
          res.status(200).send(response.data);
          console.log(response);
        }, (error) => {
          res.status(500).send(response.data);
          console.log(error);
        });
      };
      

      【讨论】:

      • 你使用的是什么版本的节点?
      • @Ari 节点 10 现在,虽然这个答案最初是在节点 8 上。
      • 谢谢,我遇到了 Node 和 ES6 支持的问题,所以认为版本很重要。原来我只需要将index.js 更改为index.mjs 谢谢你
      • @Ari 没问题。此代码也已过时,因为它使用 Promise 链接而不是 async/await。如果您愿意,可以更新我们现在使用的答案。
      猜你喜欢
      • 2017-09-15
      • 2021-08-02
      • 2019-07-11
      • 1970-01-01
      • 2023-03-08
      • 2020-02-13
      • 2013-01-03
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多