如何从 Google Cloud Functions (nodeJS) 发送 HTTP 请求

Posted

技术标签:

【中文标题】如何从 Google Cloud Functions (nodeJS) 发送 HTTP 请求【英文标题】:How to send a HTTP request from Google Cloud Functions (nodeJS) 【发布时间】: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
  
;

【问题讨论】:

【参考方案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。如果您愿意,可以更新我们现在使用的答案。

以上是关于如何从 Google Cloud Functions (nodeJS) 发送 HTTP 请求的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Function - ImportError:无法从“google.cloud”(未知位置)导入名称“pubsub”

从 Google Cloud Function (Python) 将新文件写入 Google Cloud Storage 存储桶

从 Cloud Function (python) 写入 Google Cloud Storage

无法从 GCP 调度程序调用 Google Cloud Function

从 Firebase Cloud Function 调用 Google Books API 时出现 HttpsError

如何修改后台 Cloud Function 的 Google Cloud Pub/Sub 订阅确认截止日期