Поле объекта не изменено так, как требуется после обещания. Затем и перед передачей. - PullRequest
1 голос
/ 31 марта 2019

Подведите итог проблемы

Я пытаюсь изменить некоторые поля объекта JSON, но результат, который я получаю, когда console.log или res.send не соответствует ожидаемому

ЧтоЯ уже пробовал

  1. Обещания с тогдашним
  2. Обещания с асинхронностью / ожиданием
  3. Пытался изменить поля с помощью:
user2 = {
    ...user,
    newFiels : 'newfiled',
}
Попытка изменить объект с помощью Object.assign (...) Отладка в VS Code: , которая фактически показывает ожидаемый результат (только в отладчике), но не когда я утешаю.log ...

Показать некоторый код

Я использую Sequelize, а поле " role " не находится прямо на столе " Пользователи ».Поэтому я использую и включаю (который выполняет JOIN), чтобы получить роль:

  1. Найти пользователя
  2. Определить, является ли он техником или нет
  3. Согласно 2) добавьте роль в качестве нового поля
  4. Поместите пользователя (который теперь имеет правильный синтаксис) в поле response.userInfo
  5. Отправьте данные обратно
// in login function 

let response = {
    status: "NotOK",
    userInfo: {
      username: null,
      nom: null,
      prenom: null,
      role: null,
    },
    infoMsg: null,
    error: false,
    errorMsg: null,
  }

  const usernameInput = req.query.username;
  const passwordInput = req.query.password;


// 1)
Utilisateurs.findOne({
    attributes: ['username', 'nom', 'prenom'],
    include: [
      { model: Techniciens },
      { model: Magasiniers },
    ],
    where: {
      [Op.and]: [
        { username: usernameInput },
        { password: passwordInput },
      ],
    }
  })
    .then(user => {
      if (user) {
        // 2) and 3)
        if (user.technicien != null) {
          user.role = 'technicien';
        } else {
          user.role = 'magasinier';
        }

        // 4)
        response.userInfo = user;
        response.status = 'OK'
        response.infoMsg = "User found !"
        console.log(`response : ${JSON.stringify(response)}`);
        // 5)
        res.send(response);
        return;
      } else {
        // ...
      }
    })
    .catch(error => {
      // ...
    });

Кажется, все работает, кроме 4) , и я не знаю, почему

Опишите ожидаемые и фактические результаты

Ожидаемыерезультаты

Я выполняю бэкэнд для проекта, и меня попросили указать объект этого формата (см. Ответ ):

Description: authenticate the user

Body content  : 
{
   "username" : "theUsername",
   "password" : "thePassword"
}

Response : 
{
   "status" : "OK/NotOK",
   "userInfo" : {
      "username" : "theUsername",
      "nom" : "theName",
      "prenom" : "theLastName",
      "role" : "magasinier/technicien"
   },
   "infoMsg": "infomsg",
   "error": true/false,
   "errorMsg": "errmsg"
}

Фактические результаты

{
   "status":"OK",
   "userInfo":{
      "username":"davalres",
      "nom":"Alvarez",
      "prenom":"David",
      "technicien":null,
      "magasinier":{
         "username":"davalres"
      }
   },
   "infoMsg":"User found !",
   "error":false,
   "errorMsg":null
}

То, что я вижу в отладчике до " Фактические результаты "

debugger image Как видите, все поля, которые я хочу, здесь.Может быть, я запутался, и у меня не должно быть таких полей, как __eagerlyLoadedAssociations, ...

1 Ответ

1 голос
/ 31 марта 2019

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

Вместо этого получите чистую копию необходимой информации, позвонив по номеру .get({plain:true}).Лично я бы также оставил область действия response локальной для обратного вызова then (и при необходимости создал бы другую в обратном вызове catch):

if (user) {
    let response = {
        status: "OK",
        userInfo: {
            ...user.get({plain:true}),
            role: user.technicien ? 'technicien' : 'magasinier';
        },
        infoMsg: "User found",
        error: false,
        errorMsg: null,
    };
    console.log(`response : ${JSON.stringify(response)}`);
    res.send(response);
    return;
} else //....
...