单独文件中的Express中间件(multer)

Express middleware (multer) in seperate file

本文关键字:multer 中间件 Express 文件 单独      更新时间:2023-09-26

我能够将一个非常简单的中间件(isAuthenticated)移到一个外部中间件文件中,但我在移动multer上传时遇到了困难。我刚刚学会了如何将它们移动到不同的文件中,所以这可能很直观。

routes/index.js
var middleware = require('../middleware/common');
var isAuthenticated = middleware.isAuthenticated;
var upload = middleware.multerSetup;
...
router.post('/updateuser',
    upload,
...,
    function (req, res, next) {
        res.redirect('/dashboard');
    }
);

--

//middleware/common.js
var multer = require('multer');

Middleware = {
        //Checks whether user is logged in
    isAuthenticated: function(req,res,next){
            if(req.isAuthenticated()){
                return next();
            }
            req.flash('auth',"You do not have the proper permissions to access this page");
            res.redirect('/');
        },
    multerSetup: function(req,res,next){
        var storage = multer.diskStorage({
            destination: function (req, file, cb) {
                cb(null, './public/uploads/')
            },
            //detects file type, then adds extension to match file type
            filename: function (req, file, cb) {
                var ext = "";
                switch(file.mimetype){
                    case 'image/png':
                        ext = '.png';
                        break;
                    case 'image/jpeg':
                        ext = '.jpeg';
                        break;
                    default:
                        ext = '';
                }
                cb(null, Date.now() + ext); //Appending .jpg
            }
        });

        var upload = multer({storage:storage, fileFilter: function (req, file, cb) {
            var acceptedExt = ['.png','.jpg','.gif','.bmp'];
            if (req.hasOwnProperty('file') && acceptedExt.indexOf(path.extname(file.originalname))=== -1) {
                return cb(new Error('Image type not allowed: ' + path.extname(file.originalname)));
            }
            cb(null, true)
        }});
        return upload.single('upl');
     }
};
module.exports = Middleware;

错误:

routes'index.js:108
    upload.single('upl'), 
           ^
TypeError: upload.single is not a function
    at Object.<anonymous> (C:'Users'Tyler'WebstormProjects'volunteer'volunteerApp'routes'index.js:108:12)

您的multer中间件设置错误。您的Middleware.multerSetup是一个中间件函数,然后它调用upload.single来设置multer(然后它永远不会被调用,请求保持挂起状态)。将您的multer上传设置移到自定义中间件之外,并让您的模块仅从upload.single导出返回函数。

示例:

Middleware = {
   ...
   multerSetup: upload.single('upl')
   ...
}

明白了!只需要将routes/index.js中的上传定义为一个函数。

var upload = middleware.multerSetup();

Brother在单独的文件中,声明您的设置函数,然后声明您的中间件并导出它,并传递"文件";作为上传函数中的一个参数并返回上传。single(file):

const multer = require("multer");
function multerSetup() {
  const storage = multer.diskStorage({
    destination: (req, file, cb) => {
      cb(null, "images");
    },
    filename: (req, file, cb) => {
      cb(null, file.originalname);
    },
  });
  return storage;
}
Middleware = {
  upload: function (file) {
    const upload = multer({ storage: multerSetup() });
    return upload.single(file);
  },
};
module.exports = Middleware;

在你的路线文件中写下你的路线:

const router = require("express").Router();
const Middleware = require("../helper/uploadImages");
router.post("/", Middleware.upload("file"), (req, res) => {
  res.status(200).json("file has been uploaded!");
});
module.exports = router

在index.js文件中,您只需要导入您的路线并使用它:

const uploadImageRoute = require("./routes/uploadImages");
app.use("/api/upload", uploadImageRoute);