'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 1:[1]

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 });
  }
});

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Marin Spudi?