【发布时间】:2021-10-29 10:01:18
【问题描述】:
假设我有以下路线:
POST /users 其中所有字段都是必需的,这会将用户添加到我的数据库中,假设这个用户获得了 id 的 1
{
"firstName": "FirstName",
"lastName": "LastName",
"email": "email@example.com",
"address": "address"
}
我还有路由 GET /users,它显示了数据库中的所有用户。
[
{
"id": 1,
"firstName": "FirstName",
"lastName": "LastName",
"email": "email@example.com",
"address": "address"
}
]
现在,我正在尝试更新特定用户PATCH /users 的路线。
我想让所有字段都是可选的,并且只发送我通过 PATCH 路由更新的字段,id 将从 JWT 令牌中解码。
请务必注意,数据显示在前端的表单中,我想更新表单,但只发送已从表单更新的值,而不是整个表单。实际的表单有 30 多个字段。
我知道如果我使用PUT 请求,我可以发送表单中的所有值并执行以下操作:
editUser = async ({ firstName, lastName, email, address }) => {
let sql = `UPDATE users
SET firstName = ?, lastName = ?, email=?, address=? WHERE id = ?`;
const result = await query(sql, [firstName, lastName, email, address, userId ]);
return result;
}
现在,假设我只更新表单中的电子邮件并发送它。例如:
PATCH /users
{
"email":"email@gmail.com"
}
使用以下方法也很容易:
editUser = async ({ email }) => {
let sql = `UPDATE users
SET email = ? WHERE id = ?`;
const result = await query(sql, [email, userId]);
return result;
}
以上方法是PATCH 电子邮件的好方法。
所以现在当我执行GET /users 时,我得到以下信息:
[
{
"id": 1,
"firstName": "FirstName",
"lastName": "LastName",
"email": "email@gmail.com",
"address": "address"
}
]
但是我如何处理我不知道哪些密钥被发送到后端的不同情况?例如,一组可以如下:
PATCH /users
{
"lastName": "updatedLastName"
"email":"email@gmail.com"
}
以上可以是实际对象中所有不同键的任意组合。什么是根据键生成自定义查询并仅使用需要更新的列更新表中的行的好方法?
【问题讨论】: