Firebase云功能仿真器中缺少rawBody

时间:2019-11-22 18:12:24

标签: firebase google-cloud-functions firebase-cli

https://firebase.google.com/docs/functions/http-events指示rawBody上应存在req参数。但是,它是我的本地仿真器中的undefined

我在做什么错了?

$ firebase --version
7.8.1

我的用于发布二进制数据的客户端javascript代码:

var buffer = new ArrayBuffer(4);
var view = new DataView(buffer);

function writeUTFBytes(view, offset, string) {
    var lng = string.length;
    for (var i = 0; i < lng; i++) {
        view.setUint8(offset + i, string.charCodeAt(i));
    }
}

writeUTFBytes(view, 0, 'RIFF');

var blob = new Blob([view]);

fetch('http://localhost:5001/firebase-project-name/us-central1/endpointName', {
  method: 'POST',
  body: blob
})

我的index.js firebase云功能代码:

const functions = require('firebase-functions');

exports.endpointName = functions.https.onRequest((req, res) => {
  res.set('Access-Control-Allow-Origin', 'http://localhost:3000');

  console.log(req.rawBody);
  console.log(typeof req.rawBody);

  res.end();
});

当我运行函数时,得到的是这样:

$ firebase emulators:start --only functions
<snip>
i  functions: Beginning execution of "endpointName"
>  
>  undefined

我已通过HTTP Toolkit确认该正文实际上是从我的浏览器发送的:

HTTP Toolkit showing 'RIFF' as body

1 个答案:

答案 0 :(得分:0)

我发现,如果将内容类型设置为application / octet-stream或audio / wave,那么rawBody会突然出现!

  fetch(url, {
    method: 'POST',
    headers: new Headers({
      'Content-Type': 'audio/wav',
    }),
    body: blob
  })

但是!我必须修改函数以获取OPTIONS HTTP请求,以使浏览器成功询问是否可以包含Content-Type标头,否则,实际的请求就永远不会发送:

  res.set('Access-Control-Allow-Origin', 'http://localhost:3000');

  if (req.method === 'OPTIONS') {
      // Send response to OPTIONS requests
      res.set('Access-Control-Allow-Methods', 'OPTIONS, POST');
      res.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length');
      res.set('Access-Control-Max-Age', '3600');
      return res.status(204).send('');
  }

但是,我仍然很好奇为什么没有内容类型标头就没有rawBody发生。至少,可能会有一些文档介绍了发送二进制数据和使用rawBody的端到端示例。