代码之家  ›  专栏  ›  技术社区  ›  223seneca

“sql:结果集中没有行”

  •  3
  • 223seneca  · 技术社区  · 7 年前

    我正在处理通过HTML表单发布到Go后端的用户身份验证数据。我正在建设 some boilerplate 要学得更好。

    我的问题是 func 返回值:

    func (ctrl UserController) Signin(c *gin.Context) {
    
      var signinForm forms.SigninForm
      user, err := userModel.Signin(signinForm)
    
      if err := c.ShouldBindWith(&signinForm, binding.Form); err != nil {
          c.JSON(406, gin.H{"message": "Invalid signin form", "form": signinForm})
          c.Abort()
          return
      }
    
        if err == nil {
            session := sessions.Default(c)
            session.Set("user_id", user.ID)
            session.Set("user_email", user.Email)
            session.Set("user_name", user.Name)
            session.Save()
    
            c.JSON(200, gin.H{"message": "User signed in", "user": user})
        } else {
            c.JSON(406, gin.H{"message": "Invalid signin details", "error": err.Error()})
        }
    
    }
    

    if 语句验证输入,工作正常(如果电子邮件格式不正确,则出错;如果格式不正确,则无错误)。但是,如果输入正确验证,则 else

    {
    error: "sql: no rows in result set",
    message: "Invalid signin details"
    }
    

    在我的 User 型号:

    //User ...
    type User struct {
        ID        int    `db:"id, primarykey, autoincrement" json:"id"`
        Email     string `db:"email" json:"email"`
        Password  string `db:"password" json:"-"`
        Name      string `db:"name" json:"name"`
        UpdatedAt int64  `db:"updated_at" json:"updated_at"`
        CreatedAt int64  `db:"created_at" json:"created_at"`
    }
    
    //UserModel ...
    type UserModel struct{}
    
    //Signin ...
    func (m UserModel) Signin(form forms.SigninForm) (user User, err error) {
    
        err = db.GetDB().SelectOne(&user, "SELECT id, email, password, name, updated_at, created_at FROM public.user WHERE email=LOWER($1) LIMIT 1", form.Email)
    
        if err != nil {
            return user, err
        }
    
        bytePassword := []byte(form.Password)
        byteHashedPassword := []byte(user.Password)
    
        err = bcrypt.CompareHashAndPassword(byteHashedPassword, bytePassword)
    
        if err != nil {
            return user, errors.New("Invalid password")
        }
    
        return user, nil
    }
    

    如何解决 sql: no rows in result set 错误

    2 回复  |  直到 5 年前
        1
  •  2
  •   Pavlo Strokov    7 年前

    您应该更改代码中的操作顺序。 首先,您需要使用 if err := c.ShouldBindWith(&signinForm, binding.Form); err != nil { 之后,您需要尝试使用 user, err := userModel.Signin(signinForm)

        2
  •  0
  •   Onkar Banerjee    6 年前

    这有很好的理由。理想情况下,它尝试通过分隔符读取路径,这意味着 /path/abcd/ /path/abcd 是不同的。 abcd 当资源位于 abcd 在前者。考虑到这一点,它将无法正确路由到 /路径/abcd 如果您还有路径 /path 也为了消除关于使用哪个处理程序的歧义,您需要提到更具体路径的处理程序,即, /路径/abcd 在更通用的之前 /路径 .