如何从 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