Search code examples
javascriptnode.jsmulter

Upload is not a function middleware multer route problem


This is my storage for multer I want to name files with session username and that is where my problem lays If I const upload outside I cannot access req.session.user.username anymore...

const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, "./uploads/usersprofile/");
  },
  filename: function (req, file, cb) {
    cb(
      null,
      file.fieldname +
        "_" +
        `${req.session.user.username}${path.extname(file.originalname)}`
    );
  },
});

This is my route to which I upload file but it uploads file but gives me "upload is not a function" error I am unsure how to make it work with if (req.session.user && req.session.user.username) {} and so it doesn't allow not logged in users to upload plus not show "upload is not a function" error

router.post(
  "/uploadpicture",
  multer({
    storage: storage,
    fileFilter: (req, file, cb) => {
      if (
        file.mimetype == "image/png" ||
        file.mimetype == "image/jpg" ||
        file.mimetype == "image/jpeg"
      ) {
        cb(null, true);
      } else {
        cb(null, false);
        return cb(new Error("Only .png, .jpg and .jpeg format allowed!"));
      }
    },
    limits: { fileSize: maxSize },
  }).single("avatar"),
  (req, res) => {
    if (req.session.user && req.session.user.username) {
      upload(req, res, function (err) {
        if (err instanceof multer.MulterError) {
          res.send(err);
        } else if (err) {
          res.send(err);
        }

      });
    } else {
      res.json({ loggedIn: false });
    }
  }
);

Solution

  • Fixed by creating const upload that leads to "avatar" const upload = myMulter.single("avatar");

    const storage = multer.diskStorage({
      destination: function (req, file, cb) {
        cb(null, "./uploads/usersprofile/");
      },
      filename: function (req, file, cb) {
        cb(
          null,
          file.fieldname +
            "_" +
            `${req.session.user.username}${path.extname(file.originalname)}`
        );
      },
    });
    
    const myMulter = multer({
      storage: storage,
      fileFilter: (req, file, cb) => {
        if (
          file.mimetype == "image/png" ||
          file.mimetype == "image/jpg" ||
          file.mimetype == "image/jpeg"
        ) {
          cb(null, true);
        } else {
          return cb(new Error("Only .png, .jpg and .jpeg format allowed!"));
        }
      },
      limits: { fileSize: maxSize },
    });
    
    const upload = myMulter.single("avatar");
    
    router.post("/uploadpicture", (req, res) => {
      if (req.session.user && req.session.user.username) {
        upload(req, res, function (err) {
          if (err instanceof multer.MulterError) {
            res.send(err);
          } else if (err) {
            res.send(err);
          }
        });
      } else {
        res.json({ loggedIn: false });
      }
    });