MySQLにクエリを連投できない
フォームに入力された新規ユーザーをusers
テーブルに追加する際、
- 登録したい
req.body.userName
の値が既存どうかをチェック - 登録済みでなければ新規登録する
これら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'); //新規登録完了後の処理
}
);
}
);