1

我正在尝试在 Go on GAE 中开发自定义用户模型/身份验证代码。以下代码是对 demos/guestbook 应用程序中一些代码的简单修改:

q := datastore.NewQuery("User").Filter("Email =", email)
users := make([]User, 0, 1)
if _, err := q.GetAll(c, &users); err != nil {
   http.Error(w, err.Error(), http.StatusInternalServerError)
   return
}

从表单中提取电子邮件的位置。它只是使用给定的电子邮件查询用户的数据存储。如果拥有电子邮件的用户存在,则它可以正常工作,如果不存在,则会因“内部服务器错误”页面而死。我不明白的是(我猜是关于 Go 中的错误处理,或者可能是数据存储查询),这就是为什么我不能在那个if error块内做任何其他事情。像这样的轻微mod:

if _, err := q.GetAll(c, &users); err != nil {
   fmt.Fprintf(w, "%s\n", "user not found")
}

生成相同的“内部服务器错误”页面,而不是仅打印“未找到用户”。

谢谢!

4

1 回答 1

2

很难在没有看到其余代码的情况下说出来,但要点是,当您说:

if _, err := q.GetAll(c, &users); err != nil {
   fmt.Fprintf(w, "%s\n", "user not found")
}

只有在查询过程中出现错误时才会触发内部语句,如果查询没有返回任何内容,则不会触发内部语句。因此,您实际上并没有输入该代码块-我最好的猜测(没有看到代码)是您Internal Server Error在其他地方被触发,也许在您将users其视为包含数据的变量的地方。如果您想在没有匹配用户的情况下打印出该消息,您可以执行一些简单的操作,例如检查响应的长度 - 如果是0,则不返回任何结果,您可以打印您的消息:

     if len(users) == 0 {
         fmt.Fprintf(w, "%s\n", "user not found")
     }

可能有一种更惯用的方式,但我相信这将适用于您的情况(它会按照您在那里的说明打印 - 您可能希望以不同的方式处理它)。

于 2013-01-09T01:16:25.143 回答