前提・実現したいこと
Node.jsもMySQLも初心者で、勉強もかねてブログを作ってます。
入力されたusernameが既にDB内に存在するか検証したいのですが、うまく動きません。
###想定している動作例
HPにはusernameとpasswordを入力するformと送信ボタンを用意する。(URLはlocalhost:3000/signup)
送信ボタンを押すとlocalhost:3000/signup/validateに遷移。
usernameとpasswordが入力されなかった場合、isFormFilledの時点でisValidatedがfalseになって、errorsを返す。
usernameとpasswordが入力されているが、そのusernameを持つデータがDBに既に存在したらisValidatedがfalseになって、errorsを返す。
そのusernameをもつデータが存在しない場合、それをDBに登録する。(未実装)
質問
- checkStatus関数を使用して、usernameとpasswordが空の場合、errorsにエラーが、isValidateもfalseが入っていることは確認できました。。
しかし、既にDBに登録されているusernameと適当なパスワードを入力した場合、errorsにエラーは入るものの、isValidatedがtrueのままになっていました。
isValidatedもfalseになってほしいのですが、何故trueのままなのでしょうか?
- account.jsに関して、originalとerrorsの代入が終わる前にconsole.logs(errors)が実行されてしまうのですが、どうすれば順番に処理されるのでしょうか?
該当のソースコード
account-control.js
js
1var { MYSQL_PASSWORD } = require("../../config/app.config").security; 2var mysql = require("mysql"); 3var connection = mysql.createConnection({ 4 host: "localhost", 5 user: "root", 6 password: MYSQL_PASSWORD, 7 database: "bbs" 8}); 9 10class Authenticator { 11 static createRegistUsersData(body) { 12 return { 13 username: body.username, 14 password: body.password 15 }; 16 } 17 18 static validateRegistUsersData(body) { 19 var isValidated = true, errors = {}; 20 21 var isFormFilled = () => { 22 return new Promise((resolve, reject) => { 23 if (!body.username) { 24 isValidated = false; 25 errors.username = "usernameが未入力です。"; 26 } 27 if (!body.password) { 28 isValidated = false; 29 errors.password = "passwordが未入力です。"; 30 } 31 32 if (isValidated === false) { 33 reject(); 34 } else { 35 resolve(); 36 } 37 }); 38 }; 39 40 var isUsernameUnique = () => { 41 return new Promise((resolve, reject) => { 42 if (body.username && body.password) { 43 Promise.all([() => { 44 connection.connect(); 45 connection.query({ 46 sql: "SELECT * FROM users WHERE username = ?;", 47 values: [body.username] 48 }, (error, results, fields) => { 49 if (results == "") { 50 console.log("unique"); 51 resolve(); 52 } else { 53 errors.username = "usernameは既に使用されています。"; 54 isValidated = false; 55 reject(); 56 } 57 }); 58 }, () => { 59 connection.end(); 60 }]); 61 } 62 }); 63 }; 64 65 var checkStatus = () => { 66 return new Promise((resolve, reject) => { 67 console.log(errors); 68 console.log(isValidated); 69 resolve(); 70 }); 71 }; 72 73 Promise.resolve() 74 .then(isFormFilled()) 75 .then(isUsernameUnique()) 76 .then(checkStatus()) 77 .then(() => { 78 return isValidated ? undefined : errors; 79 }); 80 } 81} 82 83module.exports = Authenticator;
account.js
js
1var router = require("express").Router(); 2var Authenticator = require("../lib/security/account-controll"); 3 4 5router.get("/", (req, res) => { 6 res.render("./account/signup.ejs", { message: req.flash("message") }); 7}); 8 9router.post("/validate", (req, res) => { 10 var original, errors; 11 Promise.resolve() 12 .then(() => { 13 original = Authenticator.createRegistUsersData(req.body); 14 errors = Authenticator.validateRegistUsersData(req.body); 15 }) 16 .then(() => { 17 console.log(errors); 18 if (errors) { 19 res.render("./account/signup.ejs", { original, errors }); 20 } 21 else { 22 res.render("./account/regist-complete.ejs"); 23 } 24 }); 25}); 26 27 28 29module.exports = router;
###追記
1.staticなメソッドをasyncさせる方法はないのでしょうか?
2.以下のvalidateRegisterUsersData()のようなPromiseチェーンを組むときに3変数になってしまうのですが、isFilledUsernameの引数をusernameだけにしてもPromiseチェーンは組めるのでしょうか?
3.以下の2点を守ってコードを書き換える際に、Promiseチェーンを組むときは以下のような形になると思ったのですが、間違ってますか?
- ejsにエラー情報を渡したいので、errorsの中にエラーを格納したい。
- クラスを崩して、すべてのメソッドをモジュールとしてexportsするのは避けたいので、Authenticatorクラスの関数として実装したい。
js
1 static validateRegistUsersData(body) { 2 console.log("validateRegistUsersData"); 3 var isValidated = true, errors = {}; 4 Promise.resolve(body.username, isValidated, errors) 5 .then(this.__isFilledUsername) 6 .then((results) => new Promise((resolve, reject) => { 7 resolve(results.isValidated); 8 })); 9 } 10 11 12 // __isFilledUsername = username, isValidated, errors => new Promise() だとエラー 13 __isFilledUsername(username, isValidated, errors) { 14 console("__isFilledUsername"); 15 new Promise((resolve, reject) => { 16 console.log(username); 17 resolve({ isValidated, errors }); 18 }); 19 } 20 21 static __isFilledPassword(password, isValidated, errors) { 22 new Promise((resolve, reject) => { 23 isValidated = false; 24 errors.password = "passwordが未入力です。"; 25 }); 26 }
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/14 17:28
2018/12/15 09:13