使用 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 发送请求属性

使用 Node.js 更新 Google Cloud Secret Manager 中的数据

如何使用Node js在Google Cloud中运行项目