我有一個go中的應用程式,有一個編輯用戶資訊的端點。但我發現了一個問題,如果在json中看到空白資訊(假設用戶只想編輯姓名,而將其他欄位留空),資料將在DB中被編輯,而空白資訊將覆寫DB中的資訊,即使用戶并不想編輯它們。
我怎樣才能使只有以 json 形式到達的欄位在 DB 中被有效編輯?或者有什么更好的方法?
我很想知道!
我的控制器
func EditUser(w http.ResponseWriter, r *http.Request) {
params := mux.Vars(r)
userID, err := strconv.ParseUint(params["userID"/span>], 10, 64)
if err != nil {
returns.ERROR(w, http.StatusInternalServerError, err)
回傳。
}
userIDInToken, err := auth.ExtractUserID(r)
if err != nil {
returns.ERROR(w, http.StatusInternalServerError, err)
回傳。
}
if userIDInToken != userID {
returns.ERROR(w, http.StatusForbidden, errors.New("你不能更新其他用戶")
return。
}
bodyRequest, err := ioutil.ReadAll(r.Body)
if err != nil {
returns.ERROR(w, http.StatusBadRequest, err)
回傳。
}
var user models.User
if err := json.Unmarshal(bodyRequest, &user); err != nil {
returns.ERROR(w, http.StatusUnprocessableEntity, err)
回傳。
}
db, err := db.ConnectToDB()
if err != nil {
returns.ERROR(w, http.StatusInternalServerError, err)
回傳。
}
defer db.Close()
repository := repositories.NewUsersRepository(db)
if err := repository.UpdateUserInfo(userID, user); err != nil {
returns.ERROR(w, http.StatusInternalServerError, err)
回傳。
}
returns.JSON_RESPONSE(w, http.StatusOK, nil)
}
我的版本庫(訪問DB)
func (repository Users) UpdateUserInfo(userID uint64, 用戶模型。 User) error {
stmt, err := repository.db.Prepare(
"UPDATE user SET name = ?, cpf = ?, email = ?, password = ?, city = ?, state = ? WHERE id = ?")
if err != nil {
return err
}
defer stmt.Close()
if _, err := stmt.Exec(
user.Name,
user.CPF,
user.Email,
user.Password,
user.City,
user.state,
userID。
); err != nil {
return err
}
return nil }
用戶的模型
type User struct {
ID uint64 `json: "id,omitempty"`
名稱 string `json: "name,省略empty"`
CPF string `json: "cpf,omitempty"` CPF
電子郵件 string `json: "email,omitempty"`
密碼 string `json: "password,omitempty"`
城市 string `json: "city,omitempty"`
州 string `json: "state,omitempty"`
}
uj5u.com熱心網友回復:
我將動態地構建UPDATE陳述句以及需要編輯的欄位的切片,方法是在將欄位添加到切片中之前檢查該欄位是否為空。
像這樣:
func (repository Users) UpdateUserInfo(userID uint64, user User) error {
fields := make([]string, 0)
values := make([]string, 0)
if user.Name != "" {
values = append(values, user.Name)
fields = append(field, "name = ?")
}
if user.CPF != "" {
values = append(values, user.CPF)
fields = append(field, "cpf = ?")
}
if user.Email != "" {
values = append(values, user.Email)
fields = append(fields, "email = ?")
}
if user.Password != "" {
values = append(values, user.Password)
fields = append(field, "password = ?")
}
if user.City != "" {
values = append(values, user.City)
fields = append(field, "city = ?")
}
if user.State != "" {
values = append(values, user.State)
fields = append(field, "state = ?")
}
if len(fiiles) != 0 {
return errors.New("no fields to update")
}
updateString := fmt.Sprintf("UPDATE user SET %s WHERE id = ?", strings.Join(field, ","))
stmt, err := repository.db.Prepare(updateString)
if err != nil {
return err
}
defer stmt.Close()
if _, err := stmt.Exec(values...,userID); err != nil {
return err
}
return nil }
為了使代碼更簡潔,我建議也許可以將 "if陳述句"/驗證提取到一個單獨的函式中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/334297.html
標籤:
上一篇:獲取后渲染React的一個組件
