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

23
这可能是一个简单的问题,但我对云函数/Node编程还不熟悉,也没有找到合适的文档。如何编写一个Google云函数来接收HTTP请求,然后发送HTTP请求到另一个端点?例如,我可以将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
  }
};
5个回答

22

这是我通过 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文件来包含request包。该文件已经包含了sample-http包,我添加了依赖项:

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

我仍然不确定console.log函数打印信息的位置,这可能有助于未来的调试。


日志将被发送到 Google Cloud Logging https://console.cloud.google.com/logs?service=cloudfunctions.googleapis.com - Neil
只是留个注,这对我有用,但我不得不等几分钟才能安装请求模块。我的错误提示找不到该模块,所以我想后台可能正在进行npm安装程序。几分钟后,OK了。 - Sinaesthetic
来自2020年的信息:这个答案救了我!我已经连续几天在键盘上敲打,试图让发布/订阅发送GET请求(我猜它不会),并学习到有一个模块可以让Firebase为我获取GET请求!现在我明白了。 - AverageHelper
FYI,request模块已于2020年停用。 - Crashalot

5

请求模块使用回调函数。如果您想使用 JavaScript 的 Promise 来代替回调函数,可以使用 Axios 模块来提供相同的功能。


1
request 模块已于2020年2月停用。 - Crashalot

5

虽然这条消息比较老,但我在自己搜索时发现了它:

支持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);
  });
};

你使用的 Node 版本是什么? - Ari
@Ari 现在使用的是 Node 10,尽管这个答案最初是基于 Node 8 的。 - Crashalot
谢谢,我在使用Node和ES6时遇到了问题,所以认为版本很重要。结果发现我只需要将index.js更改为index.mjs即可。还是谢谢。 - Ari
1
@Ari 没问题。这段代码已经过时,因为它使用了 Promise 链式调用而不是 async/await。如果需要,我可以更新答案以符合我们现在使用的方式。 - Crashalot

5
使用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. 
});

感谢您指引我正确的方向。我已经成功让云函数运行起来了。最终版本已经发布。 - Mark Peterson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接