Node.js开发Zoho Catalyst文件上传API出现请求体格式错误如何解决
解决方案
你遇到的请求体格式错误,是因为Readable.from(req.file.buffer)生成的内存可读流缺少Zoho Catalyst SDK依赖的文件元字段,和官方示例中fs.createReadStream返回的本地文件流属性不一致,导致SDK无法正确解析上传参数。
以下是两种可直接落地的实现方案:
方案1:使用磁盘临时文件(官方示例兼容方案,稳定性最高)
调整multer为磁盘存储模式,直接使用官方推荐的fs.createReadStream读取临时文件上传,上传完成后可自动清理临时文件。
步骤1:调整multer配置
const multer = require('multer'); // 配置临时文件存储目录,目录需提前创建 const upload = multer({ dest: 'tmp/uploads/' });
步骤2:修正业务代码
const fs = require('fs'); expressApp.post('/uploadFile', upload.single('file'), (req, res) => { (async () => { try { if (req.file && req.body.folderId) { const app = catalyst.initialize(req); const filestore = app.filestore(); const folder = filestore.folder(req.body.folderId); // 遵循官方示例格式传入文件流 const uploadConfig = { code: fs.createReadStream(req.file.path), name: req.file.originalname }; const result = await folder.uploadFile(uploadConfig); // 上传完成后删除本地临时文件 fs.unlink(req.file.path, (err) => err && console.error('临时文件清理失败:', err)); return res.status(200).json(successResponse(result)); } // 参数缺失建议返回400状态码,符合HTTP规范 return res.status(400).json(errorResponse('Required parameter is missing!')); } catch (error) { // 报错时也清理临时文件避免占用磁盘 req.file?.path && fs.unlink(req.file.path, () => {}); return res.status(500).json(errorResponse(error)); } })(); });
方案2:使用内存流(无需写入本地磁盘)
如果业务要求不能存储临时文件,可给内存流补上SDK需要的元属性即可正常上传:
步骤1:multer使用内存存储配置
const multer = require('multer'); const upload = multer({ storage: multer.memoryStorage() });
步骤2:修正业务代码
const { Readable } = require('stream'); expressApp.post('/uploadFile', upload.single('file'), (req, res) => { (async () => { try { if (req.file && req.body.folderId) { const app = catalyst.initialize(req); const filestore = app.filestore(); const folder = filestore.folder(req.body.folderId); const fileStream = Readable.from(req.file.buffer); // 补上SDK需要的文件元属性 fileStream.path = req.file.originalname; fileStream.size = req.file.size; const uploadConfig = { code: fileStream, name: req.file.originalname }; const result = await folder.uploadFile(uploadConfig); return res.status(200).json(successResponse(result)); } return res.status(400).json(errorResponse('Required parameter is missing!')); } catch (error) { return res.status(500).json(errorResponse(error)); } })(); });
内容的提问来源于stack exchange,提问作者Sandip Patel
相关产品推荐
相关产品推荐

