我正在使用Go Fiber和Gorm构建一个宁静的api。我正在编写一个PATCH控制器方法,我想检查传入的PATCH主体并将其与允许更新的列表进行比较。例如如果模型结构是{Username string Password string}并且PATCH方法带有“ Name”,我想抛出一个错误。截至目前,gorm只会忽略它。我还发现了Select()方法,该方法将忽略任何内容,但基于它的字符串是什么,但不会引发错误。
// UpdateUser update a user
func UpdateUser(c *fiber.Ctx) {
id := c.Params("id")
db := database.DB
updatedUser := new(models.User)
if err := c.BodyParser(updatedUser); err != nil {
c.Status(500).JSON(fiber.Map{"success": false, "data": err})
return
}
var foundUser models.User
if err := db.First(&foundUser, id).Error; err != nil {
c.Status(500).JSON(fiber.Map{"success": false, "data": err})
return
}
if err := db.Model(&foundUser).Select("Username", "Password").Updates(updatedUser).Error; err != nil {
c.Status(500).JSON(fiber.Map{"success": false, "data": err})
return
}
}
因此,我将传入的主体解析为我的模型结构。然后,我在数据库中找到当前用户,并使用新的结构对其进行更新。 .Select(“ Username”,“ Password”)仅允许对这两个键进行更改,但是如果传入请求中的值不在struct中,我想抛出一个错误。