Как обновить данные пользователя в соответствии с этой моделью и контроллером в Node.js Express - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь обновить данные пользователя на странице настроек.Где он / она может изменить все детали, такие как имя, фамилия, день рождения и так далее.Вот контроллер аутентификации:

module.exports = {
      async CreateUser(req, res) {
        const schema = Joi.object().keys({
          username: Joi.string()
            .min(4)
            .max(10)
            .required(),
          email: Joi.string()
            .email()
            .required(),
         firstName: Joi.string()
            .required(),
          lastName: Joi.string()
            .required(),
           position: Joi.string()
            .required(),
          password: Joi.string()
            .min(5)
            .required(),
        });

        const { error, value } = Joi.validate(req.body, schema);
        if (error && error.details) {
          return res.status(HttpStatus.BAD_REQUEST).json({ msg: error.details })
        }

        const userEmail = await User.findOne({
          email: Helpers.lowerCase(req.body.email)
        });
        if (userEmail) {
          return res
            .status(HttpStatus.CONFLICT)
            .json({ message: 'Email already exist' });
        }

        const userName = await User.findOne({
          username: Helpers.firstUpper(req.body.username)
        });
        if (userName) {
          return res
            .status(HttpStatus.CONFLICT)
            .json({ message: 'Username already exist' });
        }

        return bcrypt.hash(value.password, 10, (err, hash) => {
          if (err) {
            return res
              .status(HttpStatus.BAD_REQUEST)
              .json({ message: 'Error hashing password' });
          }

          const age = moment().diff(moment([value.byear, value.bmonth - 1, value.bday]), 'years');
          const body = {
            username: Helpers.firstUpper(value.username),
            email: Helpers.lowerCase(value.email),
            firstName: value.firstName,
            lastName: value.lastName,
            position: value.position,
            password: hash,
          };
          User.create(body)
            .then(user => {
              const token = jwt.sign({ data: user }, dbConfig.secret, {
                expiresIn: '5h'
              });
              res.cookie('auth', token);
              res
                .status(HttpStatus.CREATED)
                .json({ message: 'User created successfully', user, token });
            })
            .catch(err => {
                res
                    .status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .json({ message: 'Error occured' });
            });
          });
        },

Модель пользователя

const userSchema = mongoose.Schema({
  username: { type: String },
  email: { type: String },
  isVerified: { type: Boolean, default: false },
  firstName: { type: String },
  lastName: { type: String },
  position: { type: String },
  password: { type: String },

Я думаю, у меня должен быть маршрут, подобный этому:

router.post('/user/settings', AuthHelper.VerifyToken, user.editUser);

Как должен выглядеть контроллер editUser в соответствии с вышеуказанной функцией CreateUser?Я использую Angular во внешнем интерфейсе.Но я думаю, что это не имеет значения.Я предполагаю, что 90 процентов должны быть такими же, как CreateUser, но что именно следует изменить, чтобы пользователь мог обновить свои данные в форме настроек и изменить данные в модели?

1 Ответ

0 голосов
/ 19 декабря 2018

Таким образом, вы хотите обновить некоторые поля пользователя (например, firstName, lastName и т. Д.), Не заменяя всю информацию.Затем вы можете сначала получить данные текущего пользователя, а затем обновить только те разрешенные поля.

Пожалуйста, найдите пример кода ниже.

/**
 * User router
 */
router.put('/user/:userId', AuthHelper.VerifyToken, user.editUser);

// This function will be triggered when Express finds matching route parameter
router.param('userId', function (req, res, next, id) {
    User.findOne(id, function (err, user) {
        if (err) {
            next(err);
        } else if (user) {
            // When it finds user information, bind that to request object, which will be used in the other middlewares.
            req.user = user;
            next();
        } else {
            next(new Error('failed to load user'));
        }
    });
});

/**
 * User controller
 */
exports.editUser = (req, res, next) => {
    let { user } = req;

    // You pick only allowed fields from submitted body
    const allowedFields = { firstName: req.body.firstName, lastName: req.body.lastName, birthday: req.body.birthday };

    // Override the current user data with new one
    user = Object.assign(user, allowedFields);

    user.save((err, savedUser) => {
        if (err) {
            return next(err);
        }
        res.json(savedUser.toJSON());
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...