Не в состоянии хранить изображения с multer и хранить путь к базе данных mongodb - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь использовать multer , чтобы сохранить изображение в локальной папке в моей /public/uploads и сохранить изображение в моей базе данных mongodb . Я использую пн goose.

const storage = multer.diskStorage({
    destination: '../public/uploads/',
    filename: function(req,file,cb){
        cb(null,file.fieldname+'-'+Date.now()+path.extname(file.originalname))
    }
});

//init upload variable 
const upload = multer({
    storage: storage
})

Я думаю, upload.single('dp') - это промежуточное ПО, которое возвращает мой файловый объект, и я смог использовать его внутри своей функции authController.signup.

router.post("/signup",upload.single('dp'),authController.signup)

функция authController.signup

 //fields in user collection 
    var email = req.body.email;
    var password = req.body.password;
    var method = req.body.method;
    var role = req.body.role;
    var googleId = req.body.googleId
    var facebookId = req.body.facebookId
    //fields in profile collection 
    var name = req.body.name 
    var pno = req.body.pno 
    var age = req.body.age 
    var gender = req.body.gender 
    var dob = req.body.dob 
    console.log(req.file)


    switch(method){
        case "local":
            var dp = `loacalhost/images/${req.file.filename}` // This has to be changed to store the image url 
            try{
                var data = await User.findOne({email: email})
                if(data){
                    return res.status(401).json({error: "Email already exists"})
                }
                var pData = await Profile.findOne({pno: pno})
                if(pData){
                    return res.status(401).json({error: "Phone number already exists"})
                }
                //encripting user password 
                const hashedPassword = await bcrypt.hash(password,12)
                //creating user collection 
                var user = new User()
                user.method.local = true
                user.role = role
                user.email = email 
                user.password = hashedPassword
                user.isVerified = false
                await user.save() //saving user collection 
                //creating profile collectiion 
                var profile = new Profile()
                profile.name = name 
                profile.pno=pno 
                profile.age =age 
                profile.gender = gender 
                profile.dob = dob 
                profile.dp = dp 
                profile.user = user._id
                await profile.save() //saving profile collection 

                //Email Verification to be sent===========///
                const emailCode = new Code()
                emailCode.email = email 
                const hashedEmail = await bcrypt.hash(email,12)
                emailCode.code = hashedEmail
                await emailCode.save()
                await mail.sendMail(hashedEmail)
                //=========================================//

                const response = {
                    name: name,
                    role: role,
                    email: email,
                    isVerified: user.isVerified,
                }
                return res.status(200).json(response)
            }catch(err){
                res.status(404).json(err)
            }
            break
        case "google":
            var dp = req.body.dp 
            try{
                var data = await User.findOne({email: email})
                if(data){
                    return res.status(401).json({error: "Email already exists"})
                }
                var pData = await Profile.findOne({pno: pno})
                if(pData){
                    return res.status(401).json({error: "Phone number already exists"})
                }
                //creating user collection 
                var user = new User()
                user.method.google = true
                user.role = null
                user.email = email 
                user.isVerified = true
                user.googleId = googleId
                await user.save() //saving the user collection
                //creating profile collectiion 
                var profile = new Profile()
                profile.name = name 
                profile.pno=pno 
                profile.age =age 
                profile.gender = gender 
                profile.dob = dob 
                profile.dp = dp 
                profile.user = user._id
                await profile.save() //saving profile collection 
                const response = {
                    name: name,
                    role: role,
                    email: email,
                    isVerified: user.isVerified,
                }
                return res.status(200).json(response)
            }catch(err){
                return res.status(404).json(err)
            }
            break
        case "facebook":
            var dp = req.body.dp 
            try{
                var data = await User.findOne({email: email})
                if(data){
                    return res.status(401).json({error: "Email already exists"})
                }
                var pData = await Profile.findOne({pno: pno})
                if(pData){
                    return res.status(401).json({error: "Phone number already exists"})
                }
                //creating user collection 
                var user = new User()
                user.method.google = true
                user.role = null
                user.email = email 
                user.isVerified = true
                user.facebookId = facebookId
                await user.save() //saving the user collection
                //creating profile collectiion 
                var profile = new Profile()
                profile.name = name 
                profile.pno=pno 
                profile.age =age 
                profile.gender = gender 
                profile.dob = dob 
                profile.dp = dp 
                profile.user = user._id
            }catch(err){
                return res.status(404).json(err)
            }
            break
    }

Проблема

Когда я использую почтальон для проверки маршрута, все данные вводятся в базу данных, даже путь к изображению правильно в поле dp , но изображение не загружается в папку , и мой сервер выдает ошибку, что данные уже присутствуют . Эта ошибка приходит, даже если я удаляю все данные в базе данных mongodb.


Что я думаю

Я не знаю наверняка , но я думаю, что даже до того, как в папку загружаются все данные, запускается моя функция контроллера , Это заставляет функцию загрузки завершиться до sh, а затем она снова переходит в функцию контроллера и снова пытается записать в базу данных с этой ошибкой.


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...