使用 node.js 从 Google Cloud 函数中的 IncomingMessage 对象读取正文
Posted
技术标签:
【中文标题】使用 node.js 从 Google Cloud 函数中的 IncomingMessage 对象读取正文【英文标题】:Read Body from IncomingMessage Object in a Google Cloud Function with node.js 【发布时间】:2020-05-05 19:15:48 【问题描述】:我有一个基于 node.js 8 的 Google Cloud Function,我想处理 IncomingMessage
对象的主体。我无法通过req.body
访问正文,如Google Examples 中所述。我得到req.body
未定义。
如果我记录req
对象,我会得到一个IncomingMessage
对象,因此我尝试按照here 的说明读取正文,最终得到以下实现。
'use strict';
exports.insertSuccessfulConsent = (req, res) =>
console.log(`METHOD: $req.method`);
console.log(`HEADERS: $JSON.stringify(req.headers)`);
let body = "";
req.on('data', chunk =>
body += chunk.toString();
);
req.on('end', () =>
console.log(body);
);
console.log('Body: ' + body);
let message = 'POST processed';
res.status(200).send(message);
;
不幸的是,主体是空的,尽管 HTTP POST 请求的主体中有数据。这是我的测试电话:
curl -X POST HTTP_TRIGGER_ENDPOINT -H "Content-Type:application/json" -d '"name":"Jane"'
日志中的标头和 HTTP 方法是正确的,只是缺少正文。
问题是:如何从 req 对象中获取 Body?
【问题讨论】:
【参考方案1】:我不确定,但在 Google 编写的示例中,它们引用了 Express
,并且您引用了 NodeJS 普通 http
模块问题的解决方案。我不确定它是否适合这里,尽管 express
自己使用了它。
你的“数据”事件的监听器是否被调用了?如果不是,这就是您的body
为空的原因,您之前将其定义为空,并且您的侦听器从未被data
事件调用。
你的req.data
之所以设置为undefined
,可能是因为Express
中默认是undefined
。您将需要一个解析器,正如 express
在其 documentation 上指出的那样。
您可以使用类似body-parser 的模块来填充您的req.body
。
希望对你有帮助。
【讨论】:
以上是关于使用 node.js 从 Google Cloud 函数中的 IncomingMessage 对象读取正文的主要内容,如果未能解决你的问题,请参考以下文章
使用 Google Cloud Functions Node JS 10 仅从特定存储桶目录复制事件驱动的文件
如何从 Node 中的图像 url 将图像上传到 Google Cloud Storage?
使用 node.js 标准环境在 AppEngine 上找不到模块 @google-cloud/firestore
Google Cloud Vision - 如何使用 Node.js 发送请求属性