首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Firebase函数和不在解析字段或文件的Busboy

Firebase函数和不在解析字段或文件的Busboy
EN

Stack Overflow用户
提问于 2019-08-26 20:04:27
回答 1查看 1.9K关注 0票数 3

我一直在做一些关于Firebase函数和Express的实验,当我尝试用Busboy处理一个FormData时,我遇到了一个问题。似乎只有一个大的格式错误的文本字段,其中包含所有数据,包括我试图上传的任何二进制文件数据(即胡乱的ascii字符)

我尝试过在网上找到不同的解决方案,即使在这里也是如此,而且我看到所有这些解决方案都是围绕Google提供的关于多部分数据的示例构建的:https://cloud.google.com/functions/docs/writing/http

这是我的服务器端代码:

代码语言:javascript
复制
// index.js
const functions = require('firebase-functions');
const express = require('express');
const Busboy = require('busboy');

app = express();

app.post('/upload', (req, res) => {
  const busboy = new Busboy({
    headers: req.headers,
    limits: {
      // Cloud functions impose this restriction anyway
      fileSize: 10 * 1024 * 1024,
    }
  });

  busboy.on('field', (key, value) => {
    console.log(`Busboy field ${key}: ${value}`);
  });

  busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
    console.log(`Busboy file ${fieldname}: ${filename}`);
  });

  busboy.on('finish', () => {
    console.log('Busboy finish');
    return res.send({
      status: 'Success',
      text: 'Great job!'
    });  
  });

  busboy.end(req.rawBody);
});

exports.api = functions.https.onRequest(app);

这是Node的客户端:

代码语言:javascript
复制
// index.js
import axios from 'axios';
import FormData from 'form-data';

const ENDPOINT_URL = XXXXXXXXXXXXXXXXX;

const postFile = async () => {

    try {
        const form_data = new FormData();
        form_data.append('userName', 'Fred');
        form_data.append('password', 'Flintstone');
        const response = await axios.post(`${ENDPOINT_URL}/upload`, form_data);
        console.log(response.data);
    } catch (error) {
        console.error(`Error: ${error}`);
    }
}

postFile();

在客户机日志中,一切都如预期的那样,我得到了‘伟大的工作’的响应。然而,这正是我在Firebase函数日志中得到的:

代码语言:javascript
复制
Busboy field ----------------------------047691570534364316647196
Content-Disposition: form-data; name: "userName"

Fred
----------------------------047691570534364316647196
Content-Disposition: form-data; name="password"

Flintstone
----------------------------047691570534364316647196--
)

注意,它只是日志中的一个输出行,这意味着Busboy只调用onField一次。如前所述,如果我向FormData添加一个文件,输出将非常混乱,我仍然只能调用一个onField,没有一个调用onFile。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-27 07:48:44

经过进一步的调查,我发现服务器正常工作,而在客户端,我需要更改这一行:

代码语言:javascript
复制
const response = await axios.post(`${ENDPOINT_URL}/upload`, form_data);

至:

代码语言:javascript
复制
const config = { headers: { 'content-type': `multipart/form-data; boundary=${form_data._boundary}` }};
const response = await axios.post(`${ENDPOINT_URL}/upload`, form_data, config);

显然,尽管在这里的其他帖子中已经说明了这一点,但是没有指定多部分标题并不会导致自动确定它。还请注意,如果您省略了boundary设置,您将从服务器上的Busboy获得一个Boundary not found错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57664291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档