免责声明:
我尝试使用 NodeJS 解决同样的问题,并且我能够得到解决方案
我知道这是一个老问题。但我觉得值得回答这个问题,因为我花了将近 2 个小时来找出这个问题的答案。
场景一:通过 Cloud Scheduler 触发 Cloud Function
场景二:通过 Cloud Function 界面中的 Test 选项卡触发 Cloud Function
我发现了什么?
- 当 GCF 例程通过 Cloud Scheduler 执行时,它会将标头发送
content-type
为application/octet-stream
. 这使得 Express js 在 Cloud scheduler POST 数据时无法解析请求正文中的数据。
- 但是当通过 Cloud Function 接口使用完全相同的请求正文来测试函数时,一切正常,因为接口上的测试功能将标头发送
content-type
为application/json
并且 express js 能够读取请求正文并将数据解析为 JSON目的。
解决方案
我必须手动将请求正文解析为 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 - 内容类型标头问题