Moleculer文件上传服务异常:context.meta.$multipart为undefined
Moleculer 文件上传问题排查与解决
核心问题定位
问题根源在于Multipart 请求未被正确解析,导致context.meta.$multipart无法获取上传文件数据,最终无法完成文件存储。
逐步排查修复方案
1. 确认 API Gateway 的 multipart 配置
务必在api.service.js中启用 multipart 解析,配置示例如下:
module.exports = { name: "api", settings: { routes: [ { path: "/uploads", aliases: { "POST /": "assets.save", // 确保路由别名指向正确的assets服务方法 }, // 关键:开启multipart解析 bodyParsers: { multipart: { enabled: true, // 可选:设置文件大小限制,根据需求调整 limits: { fileSize: 2 * 1024 * 1024 // 限制为2MB } } } } ] } };
若你是全局配置所有路由的multipart,需确保全局
bodyParsers.multipart.enabled设为true
2. 修正 Assets Service 的方法实现
确保在assets.service.js中正确从ctx.meta.$multipart读取文件,而不是错误的位置:
module.exports = { name: "assets", actions: { save: { async handler(ctx) { const multipart = ctx.meta.$multipart; console.log("Multipart data:", multipart); if (!multipart || !multipart.files.file) { throw new Error("未上传任何文件"); } const file = multipart.files.file; // 写入public目录 const fs = require("fs").promises; const path = require("path"); const savePath = path.join(process.cwd(), "public", file.name); await fs.writeFile(savePath, file.buffer); return { success: true, path: `/public/${file.name}` }; } } } };
注意:不要错误地从
ctx.params读取文件,Moleculer的API网关会将multipart解析结果放到ctx.meta.$multipart中
3. 校验 Postman 请求配置
- 请求方法选
POST,地址填http://localhost:4000/uploads - 请求体选
form-data,键名设为file,类型选File后选择本地文件 - 不要手动设置
Content-Type,Postman会自动生成正确的multipart/form-data; boundary=xxx请求头
4. 确认依赖完整性
确保项目已安装busboy(Moleculer解析multipart的依赖库):
npm install busboy --save
缺失该依赖会导致multipart解析静默失败,直接造成ctx.meta.$multipart为undefined
5. 检查服务注册与路由映射
- 确认
api.service和assets.service已正确注册到Moleculer Service Broker - 启动服务后查看控制台输出的路由映射,确保
POST /uploads确实指向assets.save方法
内容的提问来源于stack exchange,提问作者Berkay Demirkol
相关产品推荐
相关产品推荐

