使用Busboy与Firebase Functions时遭遇Unexpected end of form错误
解决Firebase Functions中Busboy报
Unexpected end of form的方案 核心原因
Firebase HTTP Functions默认会自动解析multipart/form-data类型的请求,导致原始请求流被提前消费,Busboy无法读取完整的表单数据,从而触发"Unexpected end of form"错误。
可行解决方案
1. 禁用Firebase的请求自动解析
修改函数配置,禁用默认的请求体解析器并保留原始请求体Buffer:
export const uploadVideo = functions.https.onRequest({ rawBody: true, // 保留原始请求体Buffer parser: false // 禁用自动解析multipart/form-data }, async (req, res) => { // 后续逻辑不变,调整Busboy的调用方式 })
2. 调整Busboy的调用方式
由于请求流已被消费,不再使用req.pipe(busboy),而是直接将req.rawBody传给Busboy:
// 替换原有的req.pipe(busboy) busboy.end(req.rawBody)
3. 完整修正后的代码
import * as functions from 'firebase-functions' import * as admin from 'firebase-admin' const Busboy = require('busboy') admin.initializeApp() export const uploadVideo = functions.https.onRequest({ rawBody: true, parser: false }, async (req, res) => { try { const busboy = Busboy({ headers: req.headers }) let blob: Buffer = Buffer.from('') busboy.on('file', (fieldname: string, file: any, filename: string, encoding: string, mimetype: string) => { console.log('File received:', filename, mimetype) // 收集文件内容 file.on('data', (data: Buffer) => { blob = Buffer.concat([blob, data]) }) file.on('end', () => { console.log('File stream completed') }) }) busboy.on('finish', () => { console.log('Upload complete, file size:', blob.length) res.status(200).send('DONE!') }) busboy.on('error', (error: any) => { console.error('Busboy error:', error) res.status(500).send(`Internal server error: ${error.message}`) }) busboy.end(req.rawBody) } catch (e) { console.log('Exception:', e) res.status(500).send(`Internal server error: ${(e as Error).message}. Headers: ${JSON.stringify(req.headers)}`) } })
4. 额外排查点
- 测试时使用小体积webm文件,排除因文件过大导致的传输截断问题。
- 确认Postman配置:确保form-data中已正确添加文件,且未遗漏必填字段。
- 查看Firebase Functions日志,验证请求的
Content-Type和boundary参数是否完整传递,未被代理或中间件修改。
内容的提问来源于stack exchange,提问作者Silent Sheaf
相关产品推荐
相关产品推荐

