我有一个带有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()中定义的。如果我在不同的模块中定义了路由器,该怎么办?
如果您正在寻找一个更干净的体系结构,那么我建议遵循关注点分离原则(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,
);
它帮了我的忙,希望它能帮上忙!