使用Nodejs仅更新MySQL中用户的某些属性
我有一个put路由,可以用来更新用户。一切正常,除非用户只提供一些参数而不是全部参数。我怎样才能解决这个问题?这个问题有一些简单的解决方案吗?因为如果用户只更新他的电子邮件,其他所有内容都将被插入为空使用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
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" });
}
});
所以现在
用户只能更新某些参数
用户可以更新一些参数和他的图片
用户只能更新其图片
现在好了