我正在尝试使用 multer 将图像存储在/public/uploads
的本地文件夹中,并将图像存储在 mongodb 数据库中。我在用猫鼬。
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)
//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数据库内部的所有数据,此错误也正在出现。
我不确定,但是我认为即使在将整个数据上传到文件夹中之前,我的控制器功能也已启动。这将迫使上载功能完成,然后再次进入控制器功能,并再次尝试写入数据库并出现该错误。