Golang和PostgreSQL - " sql:结果集中没有行"

时间:2018-02-22 16:25:17

标签: sql postgresql go

我正在处理通过HTML表单发布到我的Golang后端的用户身份验证数据。我正在some boilerplate建立以更好地学习Golang。

我的问题是以下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子句,并返回以下JSON:

{
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 个答案:

答案 0 :(得分:0)

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

从数据库中获取数据

答案 1 :(得分:0)

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