2

ユーザーを作成する前に、メールとユーザー名の一意性についてデータベースをチェックする create メソッドを持つユーザーコントローラーがあります (これは、一意の属性フラグを尊重しない SailsJS の mongodb adpater のバグを回避するためのものです - バージョン 0.10 .5)。

コードは次のようになります。

User.find({ email: req.body.email }, function (err, user) {
  if(user) {
    return res.badRequest('Unique email constraint. Email is already used.');
  }
});

User.create(req.body).exec(function (err, user) {
// Code to catch and manage err or new user
}

私が期待しているのは、電子メールがデータベース (mongodb) に既に存在する場合、res.badRequest() を使用して 400 を送信すると、実行が終了することです。

何が起こるかというと、応答が送信された後、制御が User.create() に移動します - 実行は終了しません。return res.badRequest が制御を呼び出し元の関数 (User.findOne) に戻していると思われ、そこから実行が続行されます。

res.badRequest().end() を使用しようとしましたが、クライアントがハングしたままになり (応答がありません)、res.badRequest() が返された後に res.end() を使用すると「ヘッダー送信」エラーが発生しました。

既存の電子メールが見つかった場合、このリクエストの実行を終了するにはどうすればよいですか?

4

1 に答える 1

2

まず第一に、あなたfindOneはここにいfindます。これはあなたの問題とは関係ありませんが、少し紛らわしいので、期待する形式でデータを取得していることを確認する必要があります。

依頼をバッドマークして終わらせるというのは、帆は使ったことがないのですが、過去に を使って執行を終わらせることができましたres.send()。編集:ドキュメントを見た後、これはによってあなた.badRequest()のために行われているようですので、その部分は無視してください。

そうは言っても、それは実際にはあなたの問題ではありません。あなたの問題は、非同期を開始し、User.find()すぐ(非同期でも)実行を開始するため、新しいユーザーを作成しようとするまでリクエストが不良とマークさUser.create()ないことです。

あなたがする必要があるのは、次の2つのいずれかです。

  1. promise を使用して (注: これは Mongoose での動作です。Sails は異なる場合があります) が完了した後にのみ実行User.create()ますUser.find()。例えば;

    var userQuery = User.findOne({ email: req.body.email }).exec();
    userQuery.addBack(function(err, user) {
        if(!!user) res.badRequest('...');
        else create_user();
    });
    
  2. ユーザー作成ロジックをブロック内に配置します。findOne例えば;

    User.findOne({ email: req.body.email }, function(err, user) {
        if (user) { // or perhaps you want if (!err)
            User.create(...);
        } else {
            // handle error
        }
    });
    

個人的には、Promise を使用することをお勧めします (特に後で、長いチェーンのリクエストが次々と発生する場合)。

于 2014-10-01T19:47:01.767 に答える