我有一个服务文件,我正在通过 Postman 中的 POST 使用“文件”字段将文件发送到
http://localhost:4000/uploads
URL。但是,在我的代码中,context.meta.$multipart
显示为 undefined
,并且文件未保存到公共目录中。
api.service `
const ApiGateway = require("moleculer-web");
module.exports = {
name: "api",
version: 1,
mixins: [ApiGateway],
settings: {
port: 8080,
path: "/upload",
routes: [
{
path: "",
bodyParsers: {
json: false,
urlencoded: false
},
mappingPolicy: "restrict",
aliases: {
"POST /multi": {
type: "multipart",
// Action level busboy config
busboyConfig: {
limits: {
files: 3
}
},
action: "v1.assets.upload"
},
// File upload from HTML multipart form
"POST /": "multipart:v1.assets.upload",
// File upload from AJAX or cURL
"PUT /": "stream:v1.assets.upload"
},
// Route level busboy config.
busboyConfig: {
limits: {
files: 1
}
}
}
],
assets: {
folder: "./public"
}
}
};
`
assets.service.js `
module.exports = {
name: "assets",
version: 1,
actions: {
upload: {
handler(context) {
console.log("params", context.params.meta);
console.log("context.meta.$multipart", context.meta.$multipart);
}
}
}
};
`
我尝试了POST和PUT,甚至通过创建网站进行了测试,但仍然无法解决错误。在Postman中返回
200 OK
,但是文件没有上传,并且assets.service.js
文件中的两个console.log语句都返回undefined
。
该文件不会在代码中显示,只是它的名称会出现在 ctx.meta 中,但是在将其传递到管道中之后 => ctx.params.pipe(f);你会发现它是你的目标文件夹 首先你需要导入
import path from "path";
import fs from 'fs';
handler(ctx: any): any {
// to see your params
console.log({
multipart:ctx.meta.$multipart,
params:ctx.params,
$params: ctx.meta.$params,
meta:ctx.meta
});
// here is the tricks
return new Promise((resolve, reject) => {
const filePath = path.join("destination_folder_here", ctx.meta.filename );
const f = fs.createWriteStream(filePath);
f.on("close", () => {
resolve({
multipart:ctx.meta.$multipart,
params:ctx.params,
$params: ctx.meta.$params,
meta:ctx.meta
});
});
ctx.params.on("error", (err: any) => {
console.log(" error ", err.message);
reject(err);
f.destroy(err);
});
ctx.params.pipe(f);
});
}