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