Moleculer Framework API无法获取form-data请求体文件,求上传方案
Moleculer框架文件上传至MongoDB的解决方案
Moleculer的API网关默认不会解析multipart/form-data类型的请求,所以你直接在action里拿ctx.params或ctx.file会返回undefined。按以下步骤配置即可获取上传的文件:
1. 安装依赖
首先需要安装multer,它是Moleculer Web支持的文件上传解析中间件:
npm install multer --save
2. 配置API网关的multipart解析
在你的API服务(通常是api.service.js)中启用multipart支持,配置multer存储方式(这里用内存存储,方便直接转成Buffer存入MongoDB):
const ApiGateway = require("moleculer-web"); const multer = require("multer"); module.exports = { name: "api", mixins: [ApiGateway], settings: { routes: [ { path: "/api", // 启用multipart文件解析 multipart: { storage: multer.memoryStorage(), // 文件暂存内存,适合直接存MongoDB limits: { fileSize: 2 * 1024 * 1024 // 限制文件大小为2MB,可按需调整 } // 如果你的表单字段名不是默认的"file",添加fieldName配置: // fieldName: "custom_file_field" } } ] } };
3. 在Action中获取文件并存储到MongoDB
修改你的业务服务action,通过ctx.meta.$req.file(单个文件)或ctx.meta.$req.files(多个文件)获取上传的文件信息,然后将文件Buffer存入MongoDB:
actions: { create: { rest: "POST /", async handler(ctx) { try { // 获取单个上传文件 const uploadedFile = ctx.meta.$req.file; if (!uploadedFile) { throw new Error("未上传文件"); } console.log("文件名:", uploadedFile.originalname); console.log("文件类型:", uploadedFile.mimetype); // 将文件存入MongoDB(假设你的服务已经配置了MongoDB适配器) const result = await this.adapter.insert({ filename: uploadedFile.originalname, mimetype: uploadedFile.mimetype, data: uploadedFile.buffer // 内存存储的文件Buffer }); return { success: true, id: result._id }; } catch(err) { console.error("上传失败:", err); throw err; } } }, }
补充说明
- 如果使用磁盘存储(
multer.diskStorage()),需要手动读取文件内容转成Buffer后再存入MongoDB,示例:const fs = require("fs").promises; const fileBuffer = await fs.readFile(uploadedFile.path); - 确保前端请求的
Content-Type为multipart/form-data,且表单字段名与配置的fieldName一致(默认是file)。
内容的提问来源于stack exchange,提问作者Lalith Rajendran
相关产品推荐
相关产品推荐

