我的云功能的 Cloud Scheduler 作业出现问题。我使用以下参数创建了作业:
Target: HTTP
URL:我的云函数的触发网址
HTTP方式: POST
Body:
{
"expertsender": {
"apiKey": "ExprtSender API key",
"apiAddress": "ExpertSender APIv2 address",
"date": "YYYY-MM-DD",
"entities": [
{
"entity": "Messages"
},
{
"entity": "Activities",
"types":[
"Subscriptions"
]
}
]
},
"bq": {
"project_id": "YOUR GCP PROJECT",
"dataset_id": "YOUR DATASET NAME",
"location": "US"
}
}
这个身体里的真正价值观已经改变了。
当我运行这项工作时,我遇到了错误。原因是处理POST请求的body引起的。
但是,当我使用这个主体并将其用作测试中的触发事件时,我没有收到任何错误。所以我认为,我的工作中存在身体代表问题,但我不知道如何解决它。任何想法我都会很高兴。
免责声明:我尝试使用 NodeJS 解决同样的问题,并且我能够得到解决方案
我知道这是一个老问题。但我觉得回答这个问题是值得的,因为我花了近 2 个小时来找出这个问题的答案。
场景一:通过云调度器触发云功能
场景 - 2:通过云函数界面中的“测试”选项卡触发云函数
我发现了什么?
- 当 GCF 例程通过 Cloud Scheduler 执行时,它会发送标头
content-type
as application/octet-stream
。这使得当云调度程序 POST 数据时,express js 无法解析请求正文中的数据。
- 但是,当使用完全相同的请求正文通过 Cloud Function 接口测试该函数时,一切正常,因为Testing接口上的功能发送标头
content-type
as application/json
Express js 能够读取请求正文并将数据解析为 JSON 对象。
Solution
我必须手动将请求正文解析为 JSON(显式使用基于内容类型标头的 if 条件)才能获取请求正文中的数据。
/**
* Responds to any HTTP request.
*
* @param {!express:Request} req HTTP request context.
* @param {!express:Response} res HTTP response context.
*/
exports.helloWorld = (req, res) => {
let message = req.query.message || req.body.message || 'Hello World!';
console.log('Headers from request: ' + JSON.stringify(req.headers));
let parsedBody;
if(req.header('content-type') === 'application/json') {
console.log('request header content-type is application/json and auto parsing the req body as json');
parsedBody = req.body;
} else {
console.log('request header content-type is NOT application/json and MANUALLY parsing the req body as json');
parsedBody = JSON.parse(req.body);
}
console.log('Message from parsed json body is:' + parsedBody.message);
res.status(200).send(message);
};
这确实是谷歌必须解决的一个功能问题,希望谷歌尽快修复它。
Cloud Scheduler - 内容类型标头问题 https://i.stack.imgur.com/wWMNG.png
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)