无效的内存地址或QueryRow上的nil指针取消引用

时间:2020-02-07 14:46:57

标签: go

我是新手,尝试创建登录功能,尝试从数据库中查询行时出现此错误:runtime error: invalid memory address or nil pointer dere ference

此行导致的崩溃:

    result := db.QueryRow("SELECT password FROM users WHERE email=$1", credentials.Email)

这是代码:

    type Credentials struct {
    Email    string `json:"email", db:"email"`
    Password string `json:"password", db:"password"`
}

func SignIn(w http.ResponseWriter, r *http.Request) {
    credentials := &Credentials{}
    err := json.NewDecoder(r.Body).Decode(credentials)
    if err != nil {
        // If there is something wrong with the request body, return a 400 status
        w.WriteHeader(http.StatusBadRequest)
        return
    }

    psqlInfo := fmt.Sprintf("host=%s port=%d user=%s "+"dbname=%s sslmode=disable", dbInfo.Host, dbInfo.Port, dbInfo.User, dbInfo.DBname)
    db, err := sql.Open("postgres", psqlInfo)

    println(credentials.Email)
    result := db.QueryRow("SELECT password FROM users WHERE email=$1", credentials.Email)
    defer db.Close()
    if err != nil {
        //If there is an issue with the database, return a 500 error.
        w.WriteHeader(http.StatusInternalServerError)
        return
    }

    //We create another instance of 'Credentials' t store the credentials we get from the database
    storedCreds := &Credentials{}

    // Store the obtained password in `storedCreds`
    err = result.Scan(&storedCreds.Password)
    if err != nil {
        // If an entry with the email does not exist, send an "Unauthorized"(401) status
        if err == sql.ErrNoRows {
            w.WriteHeader(http.StatusUnauthorized)
            return
        }

        //If the error is of any other type, send a 500 status
        w.WriteHeader(http.StatusInternalServerError)
        return
    }

    if credentials.Password != storedCreds.Password {
        //The two passwords does not match, return a 401 status
        w.WriteHeader(http.StatusUnauthorized)
    }
}

我检查了凭据,电子邮件不为null,并且我不明白是什么原因导致了此错误。

1 个答案:

答案 0 :(得分:3)

index.html

db, err := sql.Open("postgres", psqlInfo) // ... result := db.QueryRow(...) 可能是db,因为sql.Open失败了。

您并没有像函数返回nil类型时应该做的那样检查err != nil