我正在尝试使用firebase云功能来创建外部json api的代理。但是现在我只想设置它。
我写了这个函数:
exports.helloWorld = functions.https.onRequest((request, response) => {
request.get('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
console.log(body) // Print the google web page.
}
})
});
然后我运行firebase函数模拟器并运行
curl http://localhost:5000/<project-id>/us-central1/helloWorld
它返回一条消息,说明该函数已被触发,开始执行,但它只是坐在那里旋转直到最终超时。
{"error":{"code":500,"status":"INTERNAL","message":"function execution attempt timed out"}}
我不确定我做错了什么。
........
修改的
此功能完美无缺:
exports.helloWorld = functions.https.onRequest((request, response) => {
response.send('test');
})
答案 0 :(得分:7)
使用云功能,HTTPS类型功能必须将结果写入客户端以指示功能已完成执行。在写入结果之前,假定该函数仍在运行异步工作。
因此,当您的请求完成后,您应该发送一些回复,即使它是空的。不幸的是,您已将主要response
对象与另一个对象隐藏起来,因此您可能应该重命名其中一个:
exports.helloWorld = functions.https.onRequest((request, response) => {
request.get('http://www.google.com', function (error, res, body) {
if (!error && res.statusCode == 200) {
console.log(body) // Print the google web page.
}
return response.send("") // this terminates the function
})
})
答案 1 :(得分:4)
HTTPS功能无法完成,直到您在响应中发送内容为止。这是一个将代理请求中的内容作为输出进行管道传输的示例(我必须更改变量名称以避免出现阴影:
exports.helloWorld = functions.https.onRequest((req, res) => {
request.get('http://www.google.com', function (error, response, body) {
if (!error && response.statusCode == 200) {
return res.send(body) // Print the google web page.
}
return res.send('ERROR: ' + error.message);
})
});