这是我尝试使用email属性插入实体的地方。在浏览器中,U可以看到已收到db_success。在数据存储区查看器中,我可以看到实体是通过2次写入插入的,这种写入非常低,浏览到实体我可以看到实体种类,实体密钥和ID,但没有别的:
c := appengine.NewContext(r)
u := user.Current(c)
if u == nil || !user.IsAdmin(c) {
return
}
addrmv := r.FormValue("addrmv")
user_email := r.FormValue("user_email")
if addrmv == "add" {
if user_email == "" {
return
}
uemail := uemail_struct{
user_email: user_email,
}
_,err := datastore.Put(c,datastore.NewIncompleteKey(c,"users",nil),&uemail)
if err != nil {
io.WriteString(w, "\"result\":\"db_error\"")
} else {
io.WriteString(w, "\"result\":\"db_success\"")
}
} else if addrmv == "rmv"{
return
//TODO expand
}
另一段代码是我想根据电子邮件限制用户访问的地方。我尝试在我之前插入的实体的电子邮件属性上执行数据存储查询,并将授权帐户重定向到预期页面,将未经授权的帐户重新定向到应用程序条目URL:
c := appengine.NewContext(r)
u := user.Current(c)
if u == nil {
http.Redirect(w, r, "/", http.StatusSeeOther)
} else if user.IsAdmin(c) {
io.WriteString(w, admins_choice_html)
} else {
var emails []uemail_struct
q := datastore.NewQuery("users").Filter("user_email =", u.Email)
_,err := q.GetAll(c,&emails)
if err != nil {
http.Redirect(w, r, "/", http.StatusSeeOther)
}
if len(emails) == 0 {
url, err := user.LogoutURL(c, "/")
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
w.Header().Set("Location", url)
w.WriteHeader(http.StatusFound)
} else {
http.Redirect(w, r, "/dist/index.html", http.StatusSeeOther)
}
}
我确信我的测试数据和添加用户电子邮件的功能都可以。这意味着我执行了数据user@example.com电子邮件地址的第一段代码,并执行了相同user@example.com电子邮件地址的第二段代码。我可以得出的唯一结论是,第一段代码中的数据存储区没有在数据存储区中插入值为user@email.com的必需属性user_email。
答案 0 :(得分:1)
我发现问题只是他们定义我的结构的方式。而不是
type uemail_struct{
user_email string
}
简单地写
type Uemail_struct{
User_email string
}
修复程序,现在添加新用户及其登录工作。