1

GoonGAEでカスタムユーザーモデル/認証コードを開発しようとしています。次のコードは、デモ/ゲストブックアプリケーションの一部のコードを簡単に変更したものです。

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
}

メールがフォームから取得される場所。指定された電子メールでユーザーをデータストアに照会するだけです。電子メールを持っているユーザーが存在する場合は正常に機能し、存在しない場合は「内部サーバーエラー」ページで終了します。if error私が理解していないこと(Goでのエラー処理、またはデータストアクエリについて推測します)は、そのブロック内で他に何もできない理由です。このようなわずかなmod:

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

「usernotfound」を出力するだけでなく、同じ「InternalServerError」ページを生成します。

ありがとう!

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 に答える