使用Nodejs仅更新MySQL中用户的某些属性

使用Nodejs仅更新MySQL中用户的某些属性,mysql,node.js,express,Mysql,Node.js,Express,我有一个put路由,可以用来更新用户。一切正常,除非用户只提供一些参数而不是全部参数。我怎样才能解决这个问题?这个问题有一些简单的解决方案吗?因为如果用户只更新他的电子邮件,其他所有内容都将被插入为空 const id: number = req.params.id; const password: string = req.body.password; const email: string = req.body.email; c

我有一个put路由,可以用来更新用户。一切正常,除非用户只提供一些参数而不是全部参数。我怎样才能解决这个问题?这个问题有一些简单的解决方案吗?因为如果用户只更新他的电子邮件,其他所有内容都将被插入为空

        const id: number = req.params.id;
        const password: string = req.body.password;
        const email: string = req.body.email;
        const lastname: string = req.body.lastname;
        const firstname: string = req.body.firstname;
        const phoneNumber: string = req.body.phoneNumber;
        const permissionID: number = req.body.permissionID;
        const imageUrl: string = String(imagePath);


        const passwordHash = bcrypt.hashSync(password, 10);
        const insertData: [string, string, string, string, string, string, number, number]  = [email, passwordHash, phoneNumber, firstname, lastname, imageUrl, permissionID, id];
        const query = `UPDATE Users SET email = ?, password = ?, phone_number = ?, first_name = ?, last_name = ?, image_url = ?, permission_id = ? WHERE user_id = ?;`;
        connection.query(query, insertData, (err: MysqlError | null) => { 
              if (!err) {
                res.status(200);
                res.json( { "Message": "Successfull user was updated" } );
              } else {
                res.status(500);
                res.json( { "Database Error ": err.message } );
              }  
        });

当有人编辑用户或其他类型的数据时,我要做的是为用户检索整个数据并将其显示在编辑表单上。然后,当他们进行更新时,我会发送所有数据。这样,当我执行SQL更新时,它将重新保存未更改的数据以及更改的数据


另一个选项是一系列条件,这些条件根据要更新的字段添加到update语句中。

您可以只设置提供的值,或者,如果你真的坚持要更新所有栏目,为什么不在PK时先查询它们。

好的,我写了一些东西,希望这篇文章能帮助别人。首先,当然可以在客户端保存完整的用户数据模型,并将完整的数据重新发送到服务器。但我为什么要这样做?我不认为这是有效的。如果用户只是想更改他的姓氏,为什么我应该发送整个有效负载…无论如何,这是我解决问题的方法

首先,我定义了如果用户更新某些属性,我将收到的可能数据

enum Validate {
  password = 'password',
  email = 'email',
  firstname = 'first_name',
  lastname = 'last_name',
  phoneNumber = 'phone_number',
  permissionID = 'permission_id'
}
因此,我的函数将检查接收到的参数,并返回insertData和query。当我使用密码散列时,它也会检查用户是否想要更新他的密码

function updateParams(body: {}, options: [Validate], callBack: (insertData: string[], query: string) => void) {
  const insertData: string[] = [];
  let query = "";
  for (const index in options) {
    if (!(body[`${options[index]}`] === '' || body[`${options[index]}`] === undefined || body[`${options[index]}`] === null)) {
      query += `${options[index]} = ?, `;
      // If user will update password hash it
      `${options[index]}` === 'password' ? insertData.push(bcrypt.hashSync(body[`${options[index]}`], 10)) : insertData.push(body[`${options[index]}`]);
    }
  }
  callBack(insertData, query.slice(0, -2));
}
下一步,我将使用承诺,因为有一些if/else语句。例如,用户可以只更新他的图片

const updateUser = (req, res, insertData, query) => {
  const promise = new Promise((resolve, reject) => {
    let endQuery = '';
    if (req.file) {
      image.uploadImageToStorage(req.file)
        .then((imagePath) => {
          if (Object.keys(req.body).length === 0) {
            endQuery = `UPDATE Users SET image_url = ? WHERE user_id = ?;`;
            insertData.push(String(imagePath));
            insertData.push(req.params.id);
            resolve([endQuery, insertData]);
          } else {
            endQuery = `UPDATE Users SET ${query}, image_url = ? WHERE user_id = ?;`;
            insertData.push(String(imagePath));
            insertData.push(req.params.id);
            resolve([endQuery, insertData]);
          }

        }).catch((error) => {
          reject(error.message );
        });

    } else {
      endQuery = `UPDATE Users SET ${query} WHERE user_id = ?;`;
      insertData.push(req.params.id);
      resolve([endQuery, insertData]);
    }

  });
  return promise;
};
现在我可以用我的路线了

app.put('/api/v1/users/:id', image.multerMiddleware.single('image'), (req, res) => {

  if (((Object.keys(req.body).length !== 0) || req.file) && !isNaN(req.params.id)) {
    updateParams(req.body, [Validate.password, Validate.email, Validate.lastname, Validate.firstname, Validate.phoneNumber, Validate.permissionID], (insertData, query) => {

      updateUser(req, res, insertData, query)
          .then((result) => {
            connection.query(result[0], result[1], (err: MysqlError | null) => {
              if (!err) {
                res.status(200);
                res.json({ "Message": "Successfull user was updated" });
              } else {
                res.status(500);
                res.json({ "Database Error ": err.message });
              }
            });

          }).catch((error) => {
            res.status(500);
            res.json({ "Error ": error.message });
          });
    });
  } else {
    res.status(400);
    res.json({ "Error": "Please provide the correct paramaters" });
  }

});
所以现在

用户只能更新某些参数 用户可以更新一些参数和他的图片 用户只能更新其图片 现在好了