提问者:小点点

如何在不同文件中定义multer存储?


我有一个带有Express的节点应用程序。服务器位于server.js,路由器设置如下:

app.use('/xyz', xyz);
app.use('/abc', abc);

路由器xyz和abc位于/routes中的不同路由模块中。我想用multer上传图片到MongoDB。上载文件的终结点是/xyz/upload

storage = new GridFsStorage({
    url: process.env.DB_URL,
    file: (req, file) => {
    return new Promise((resolve, reject) => {
        const filename = file.originalname;
        const fileInfo = {
            filename: filename,
            bucketName: 'uploads'
        };
        resolve(fileInfo);
    });
    }
});

如何在xyz路由器文件中定义此const upload=multer({storage});

INTERNET上的所有示例都显示MULTER是在server.js和app.post()中定义的。如果我在不同的模块中定义了路由器,该怎么办?


共1个答案

匿名用户

如果您正在寻找一个更干净的体系结构,那么我建议遵循关注点分离原则(SoC),将文件处理中间件放在一个单独的文件中,如下所示:

const multer = require("multer");

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "./public/uploads");
  },
  filename: function (req, file, cb) {
    const uniqueSuffix = Date.now() + "-" + Math.round(Math.random() * 1e9);
    cb(
      null,
      new Date().getTime() + "-" + uniqueSuffix + "-" + file.originalname
    );
  },
});

const fileFilter = (req, file, cb) => {
  // reject all files except jpeg
  if (file.mimetype === "image/jpeg") {
    cb(null, true);
  } else {
    cb(null, false);
  }
};

const upload = multer({
  storage: storage,
  limits: {
    fileSize: 1024 * 1024 * 15, // 15mb max size,
  },
  fileFilter: fileFilter,
}).array("Photos", 6);

然后可以尝试将上传功能包装起来,这样导出,以便作为中间件处理:

exports.upload = function (req, res, next) {
  try {
    upload(req, res, next);
  } catch (err) {
    next(err);
  }
};

然后,在您的路由中,如果您使用的是CommonJS,那么一个简单的要求就足够了:

const fileHandling = require("./fileHandling");

server.post(
    `/route`,
    fileHandling.upload,
    controller,
  );

它帮了我的忙,希望它能帮上忙!