Я пытаюсь использовать 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, а затем она снова переходит в функцию контроллера и снова пытается записать в базу данных с этой ошибкой.