В моем веб-приложении пользователи могут обновить свой профиль.
Но в некоторых полях на странице профиля обновления, если пользователь не добавляет к ним никакой информации, после сохранения эти поля удаляются, как если бы они обновлялись без данных.
Но остальные в порядке.
Это мой файл обновления мопса:
form(action="/account" method="POST" enctype="multipart/form-data")
label(for="name") Name
input(type="text" name="name" value=user.name)
label(for="email") Email Address
input(type="email" name="email" value=user.email)
//- Image Upload
label(for="photo") Photo
input(type="file" name="photo" id="photo" accept="image/gif, image/png, image/jpeg")
if user.photo
img(src=`/uploads/${user.photo}`, alt=user.name width=200)
label(for="neighborhood") Neighborhood
input(type="text" id="neighborhoodUpdate" name="location[vicinity]" value=(user.location && user.location.vicinity))
поля с ошибками - это фото, а окрестности (окрестности).
Тогда у меня есть этот маршрут:
router.post('/account',
userController.upload,
catchErrors(userController.resize),
catchErrors(userController.updateAccount)
);
И в моем контроллере у меня есть следующие методы:
const multerOptions = {
storage: multer.memoryStorage(),
fileFilter(req, file, next) {
const isPhoto = file.mimetype.startsWith('image/');
if (isPhoto) {
next(null, true);
} else {
next({ message: 'That filetype isn\'t allowed!' }, false);
}
}
};
// To upload photos
exports.upload = multer(multerOptions).single('photo');
exports.resize = async (req, res, next) => {
// check if there is no new file to resize
if (!req.file) {
next(); // skip to the next middleware
return;
}
const extension = req.file.mimetype.split('/')[1];
req.body.photo = `${uuid.v4()}.${extension}`;
// now we resize
const photo = await jimp.read(req.file.buffer);
await photo.resize(800, jimp.AUTO);
await photo.write(`./public/uploads/${req.body.photo}`);
// once we have written the photo to our filesystem, keep going!
next();
};
И, наконец, обновить учетную запись:
exports.updateAccount = async (req, res) => {
req.body.location.type = 'Point';
const updates = {
name: req.body.name,
photo: req.body.photo,
email: req.body.email,
musicLink: req.body.musicLink,
genres: req.body.genres,
location: {
vicinity: req.body.vicinity,
address: req.body.location.address,
type: req.body.location.type,
coordinates: [
req.body.location.coordinates[0],
req.body.location.coordinates[1],
]
}
};
const user = await User.findOneAndUpdate(
{ _id: req.user._id },
{ $set: updates },
{ new: true, runValidators: true, context: 'query' }
);
req.flash('success', 'Updated the profile!');
res.redirect('back');
};
Из того, что я вижу, фото и окрестности должныне обновляться без данных, но каким-то образом, если пользователь не добавляет новые данные, старые удаляются.
Есть идеи?
О, вот моя модель пользователя:
const userSchema = new Schema({
email: {
type: String,
unique: true,
lowercase: true,
trim: true,
validate: [validator.isEmail, 'Invalid Email Address'],
required: 'Please Supply an email address'
},
name: {
type: String,
required: 'Please supply a name',
trim: true
},
resetPasswordToken: String,
resetPasswordExpires: Date,
props: [
{ type: mongoose.Schema.ObjectId, ref: 'User' }
],
// New stuff
slug: {
type: String,
unique: true,
},
genres: [String],
musicLink: String,
created: {
type: Date,
default: Date.now
},
location: {
type: {
type: String,
default: 'Point'
},
coordinates: [{
type: Number,
required: 'You must supply coordinates!'
}],
address: {
type: String,
required: 'You must supply an address!'
},
vicinity: {
type: String,
},
},
photo: String,
});