Обновление профиля пользователя не работает при нажатии кнопки обновления в Angular - PullRequest
0 голосов
/ 07 января 2019

Мы используем Angular с Node.js Express. Мы пытаемся обновить данные пользователя со страницы настроек, но при нажатии кнопки обновления выдается:

Не удалось загрузить ресурс: net :: ERR_CONNECTION_RESET Кажется, не может отправить обновление через наблюдаемый. Когда я проверяю этот URL в узле: http://localhost:3000/api/chatapp/user/edit-user В браузере написано {"message": "Нет авторизации"} . Вот код.

Угловая

  EditUser(body): Observable<any> {
    return this.http.post(`${BASEURL}/user/edit-user`, body);
  }

TS

private populateForm() {
    const unusedFields = [
      '_id',
    ...
    ...
    ];

    const userInfo = Object.assign({}, this.user);
    unusedFields.forEach((field) => delete userInfo[field]);
    this.SettingsForm.setValue(userInfo);
  }

  private buildSettingsForm() {
    this.SettingsForm = this.fb.group({
      email: [null, [Validators.required, Validators.email], this.forbiddenEmails],
      firstName: [null, [Validators.required, Validators.pattern('[a-zA-Z ]*')]],
      jobTitle: [null, [Validators.required]],
      lastName: [null, [Validators.required, Validators.pattern('[a-zA-Z ]*')]],
      username: [null, [Validators.required, Validators.pattern('(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])')]]
    });
    this.SettingsForm.setValidators(this.minimumAge(18));
  }

  UpdateUser() {
    this.usersService.EditUser(this.SettingsForm.value).subscribe(
      data => {
        console.log(data);
        this.router.navigate(['main']);
      },
      err => console.log(err)
    );
}

Также Node.js :

async EditUser(req, res,next) {

User.findById(req.user.id, function (err, user) {

  if (!User) {
    return res
    .status(httpStatus.INTERNAL_SERVER_ERROR)
    .json({ message: 'User is not found' });
}

  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(),
      jobTitle: Joi.string().required(),
  });

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

const email = Helpers.lowerCase(req.body.email);
const username = Helpers.lowerCase(req.body.username);
const firstName = req.body.firstName;
const lastName = req.body.lastName;
const jobTitle = req.body.jobTitle;

User.email = email;
User.firstName = firstName;
User.lastName = lastName;
User.username = username;
User.jobTitle = jobTitle;

User.update()
});
} 
}

Маршрутизатор

router.post('/user/edit-user', AuthHelper.VerifyToken, UserCtrl.EditUser);

MongoDb

    const userSchema = mongoose.Schema({
      username: { type: String },
      email: { type: String },
      isVerified: { type: Boolean, default: false },
      password: { type: String },
      passwordResetToken: String,
      passwordResetExpires: Date,
      firstName: { type: String },
      lastName: { type: String },
      jobTitle: { type: String },
...
...
module.exports = mongoose.model('User', userSchema);

Я думаю, что-то не так в контроллере Node.js и в функции Angular. Что случилось? Как мы можем исправить эту ошибку?

1 Ответ

0 голосов
/ 07 января 2019

вы отправили токен с запросом?!

вы забыли построить схему

    const userSchema = new mongoose.Schema({
      username: { type: String },
      email: { type: String },
      ...
   )}

чтобы поймать ошибку, вы можете передать обратный вызов в качестве аргумента для сохранения функции.

user.save(function (err, updatedUser) {
    if (err) {
        /* Handle the error */
    };
 });

вы можете использовать набор user.set({ [key]: value }); вместо прямого доступа с помощью точечной нотации, например, user.firstname

в вашей ситуации это будет похоже на

user.set({
        email: email,
        firstName: firstName,
        lastName: lastName,
        username: username,
        jobTitle: jobTitle
})

Ваш окончательный код будет

async EditUser(req, res, next) {
    User.findById(req.user.id, function (err, user) {
        if (!user) {
            return res
                .status(httpStatus.INTERNAL_SERVER_ERROR)
                .json({ message: 'User is not found' });
        }
        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(),
            jobTitle: Joi.string().required(),
        });
        const { error, value } = Joi.validate(req.body, schema);
        if (error && error.details) {
            return res.status(HttpStatus.BAD_REQUEST).json({ msg: error.details })
        }
        const email = Helpers.lowerCase(req.body.email);
        const username = Helpers.lowerCase(req.body.username);
        const firstName = req.body.firstName;
        const lastName = req.body.lastName;
        const jobTitle = req.body.jobTitle;
        user.set({
            email: email,
            firstName: firstName,
            lastName: lastName,
            username: username,
            jobTitle: jobTitle
        });
        user.save(function (error, updatedUser) {
            if (error) {
                /* Handle it */
            }
        })
    });
}

Вы можете узнать больше о документах мангуста для более подробной информации

Обновление документа mongoose

как примечание, в методе populateForm вы можете фильтровать объект по массиву unusedFields без использования delete ключевое слово

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