分子文件上传服务

问题描述 投票:0回答:1

我有一个服务文件,我正在通过 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

javascript node.js upload microservices moleculer
1个回答
0
投票

该文件不会在代码中显示,只是它的名称会出现在 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);
                }); 
            }
© www.soinside.com 2019 - 2024. All rights reserved.