Данные некоторых полей стираются при обновлении профиля пользователя - PullRequest
0 голосов
/ 03 марта 2019

В моем веб-приложении пользователи могут обновить свой профиль.

Но в некоторых полях на странице профиля обновления, если пользователь не добавляет к ним никакой информации, после сохранения эти поля удаляются, как если бы они обновлялись без данных.

Но остальные в порядке.

Это мой файл обновления мопса:

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

1 Ответ

0 голосов
/ 03 марта 2019

Я думаю, что если поля не определены, вам, вероятно, нужно явно удалить их из объекта обновления, иначе эти поля будут установлены как неопределенные.Простое существование ключа в объекте обновления подразумевает изменение этого ключа в целевой записи при использовании оператора thr $ set.

Так что сделайте что-то вроде:

если (! Updates.photo) удалить updates.photo

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