0
0
はじめての記事投稿
Qiita Engineer Festa20242024年7月17日まで開催中!

1つのルートで複数のクエリを順番に処理する方法

Last updated at Posted at 2024-07-03

MySQLにクエリを連投できない

フォームに入力された新規ユーザーをusersテーブルに追加する際、

image.png

  1. 登録したいreq.body.userNameの値が既存どうかをチェック
  2. 登録済みでなければ新規登録する

これら2つのアクションを1つのルートの中で順番に処理する必要がある。しかしひとつのアクション内でMySQLへクエリを投げられるのは一度だけのようで、以下のようなコードはエラーになってしまう。

app.post('/adduser', (req, res) => {
    ////重複チェック action1
    connection.query(`
        SELECT * FROM users WHERE name=?`,
        [req.body.userName],                  //formに入力された登録したいname
        (error, results) => {
            if(results.length > 0){           //true:すでに登録済み
                res.json({message : 'presented'});
                                              //「登録済み」とメッセージを返して新規登録せずに終了
            }else{                            //false:未登録。新規登録するため、次の処理へ
    ////MySQLに保存 action2
                connection.query(`
                    INSERT INTO users (name) values (?);`,
                    [req.body.userName],
                    (error, results) => {
                        res.redirect('/top');             //新規登録完了後の処理
                    }
                );
            }
        }
    );
},

そもそも1つ目のクエリ処理の中に2つ目のクエリが入り込んでいるので、その時点でちょっと無理がありすぎる。

【解決策】next()を使って、複数の関数を順番に実行

1つのルートに対して複数のアクション(関数)を登録することは可能なので、1つのクエリにつき1つのアクション(関数)を割り当てる。
次のアクションへの移動はnext()関数を使うことで制御できる。↓概略↓

app.post('/adduser',
    (req, res, next) => {
        //1つ目のクエリと処理
        next();
    },
    (req, res) => {
        //2つ目のクエリと処理    
    }
);

1つ目の引数にnextを追加し、次の処理に進みたいタイミングでnext()関数を読み込むと、2つ目のアクションの実行へ移る

入力された新規ユーザーをusersテーブルに追加するコード例

 action1. 登録したいreq.body.userNameの値が既存どうかをチェック
 action2. 登録済みでなければ新規登録する

app.post('/adduser',
////重複チェック action1
    (req, res, next) => {                     
        connection.query(`
            SELECT * FROM users WHERE name=?`,
            [req.body.userName],                  //formに入力された登録したいname
            (error, results) => {
                if(results.length > 0){           //true:すでに登録済み
                    res.json({message : 'presented'});
                                                  //「登録済み」とメッセージを返して新規登録せずに終了
                }else{                            //false:未登録
                    next();                       //新規登録するため、次の処理へ
                }
            }
        );
    },
////MySQLに保存 action2
    (req, res) => {
        connection.query(`
            INSERT INTO users (name) values (?);`,
            [req.body.userName],
            (error, results) => {
                res.redirect('/top');             //新規登録完了後の処理
            }
        );
    }
);
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0