在promise.then之后和res.send之前未按需要修改对象字段

时间:2019-03-31 13:53:00

标签: node.js express promise sequelize.js javascript-objects

总结问题

我正在尝试更改JSON对象的某些字段,但是当我console.log或res.send时得到的结果不是预期的

我已经尝试过的东西

  1. 承诺那么
  2. 承诺异步/等待
  3. 试图使用更改字段:
create('bar') astype Bar
  1. 试图使用Object.assign(...)更改对象
  2. 使用VS Code进行调试:实际上显示了预期的结果(仅在调试器中),但是当我console.log ...时却未显示。

显示一些代码

我正在使用Sequelize,并且字段“ 角色”不直接位于表“ 用户”上。因此,我使用和 include (执行JOIN)来获得角色:

  1. 查找用户
  2. 确定他是否是技术员
  3. 根据2)将角色添加为新字段
  4. 将用户(现在具有正确的语法)放在response.userInfo字段中
  5. 发送回数据
user2 = {
    ...user,
    newFiels : 'newfiled',
}

4)之外,其他所有功能似乎都可以使用,我不知道为什么

描述预期结果和实际结果

预期结果

我正在做一个项目的后端,要求我提供这种格式的对象(请参阅响应):

// 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 => {
      // ...
    });

实际结果

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"
}

我在调试器中看到的“ 实际结果

之前

debugger image 如您所见,我想要的所有字段都在这里。也许我很困惑,我不应该拥有{ "status":"OK", "userInfo":{ "username":"davalres", "nom":"Alvarez", "prenom":"David", "technicien":null, "magasinier":{ "username":"davalres" } }, "infoMsg":"User found !", "error":false, "errorMsg":null } ,...

之类的所有字段

1 个答案:

答案 0 :(得分:1)

您获得的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 //....