golang appengine内部服务器错误

时间:2013-01-09 00:50:26

标签: google-app-engine go internal-server-error

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

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块中做任何其他事情。像这样的轻微模式:

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

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

谢谢!

1 个答案:

答案 0 :(得分: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")
     }

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