teratail header banner
teratail header banner
質問するログイン新規登録
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

2回答

1560閲覧

パスワード変更に関して教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

1クリップ

投稿2018/10/08 16:27

編集2018/10/09 03:16

0

1

Javascriptでパスワードの変更処理を作成しています。
Node.jsで開発してるのもあるかどうかちょっとわからないのでアドバイスのほうをお願いいたします。

処理の流れ
①入力すべき内容の入力を行う。
・登録してあるパスワード
・新しく登録するパスワード
・確認のために新しいパスワードをもう一度入力する

②適用ボタンの押下で処理は終了になります。
変更による処理はUpdate文でいけると考えております。

ここで考えられるエラー処理は、
・登録しているパスワードが存在しない場合
・入力されている新しいパスワードと確認用が一致しない場合
・正規表現にかかわるエラー?(これは必要かどうかわからない)の3つだと思います。

処理の流れはこんな感じです。
入力した値をどう取得するのか、どのようなメソッドを使うとよいのか、関数は必要かなどを教えてはいただけないでしょうか?

password_change.ejs

html

1<!DOCTYPE html> 2<html lang="ja"> 3<%- include('../ejs-template/head', { 4 title:'パスワード変更', 5 css:'/bit-scheduler/password_change/css/style.css', 6 libraries:[] 7}) %> 8 9<body> 10 <%- include('../ejs-template/header', { 11 staff: type === 'staff' 12 }) %> 13 <div id="main"> 14 <div id="sidebar"> 15 <h3>個人設定</h3> 16 <p>ログインID: </p> 17 <p>作成日: </p> 18 <p>アカウント削除</p> 19 </div> 20 <form action="/password_change" method="post"> 21 <div id="content"> 22 <h2>パスワード変更</h2> 23 <div class="splitcontext"> 24 <fieldset class="well"> 25 <p class="info"><label>パスワード</label> 26 <input type="password" name="password" class="form-control"> 27 </p> 28 <p class="info"><label>新しいパスワード</label> 29 <input type="new_pass" name="new_pass" class="form-control"> 30 </p> 31 <p class="info"><label>パスワードの確認</label> 32 <input type="confirm" name="confirm" class="form-control"> 33 </p> 34 </fieldset> 35 <% if (typeof pass !== 'undefined'){ %> 36 <p class="error"><%= pass %></p> 37 <% } %> 38 <p> 39 <button class="btn btn-primary" type="submit" name="save">適用</button> 40 </p> 41 </div> 42 </div> 43 </div> 44</body> 45 46</html>

password_change.js

js

1const router = require('express').Router(); 2 3router.get('/', (req, res, next) => { 4 res.render('password_change/index', { 5 name: req.session.user.name, 6 type: req.session.user.type 7 }); 8}); 9 10router.post('/', (req, res, next) => { 11 const password = req.body.pasword; 12 const new_pass = req.body.new_pass; 13 const confirm = req.body.confirm; 14//こんな感じでupdate文を行うのであっているのか? 15 const query = 'UPDATE user SET password = ? WHERE id = ?'; 16//以下のところでエラーの処理を書きたいのですがどう書いたらよいのかわかりません。 17 connection.query(query, function(err, ){ 18 if (pass) { 19 res.render('pass_change', { 20 title:'パスワード変更', 21 pass:'パスワードが間違っています' 22 }); 23 }else{ 24 connection.query(registerQuery, function(err, rows) { 25 res.redirect(''); 26 }); 27 } 28 }); 29}); 30 31module.exports = router;

Node.jsによる開発はこれが初めてですので、ご指導ご鞭撻よろしくお願いいたします。
まだ足りないと思う情報がもしあればコメントのほうでよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/10/08 22:17

諸事情とか他人には関係ないのであまり書かれないほうが方が良いです。「至急」などつくと敬遠されがちになります。 急がば回れで今無理矢理でも時間をかけておいた方が後から無駄な時間を浪費せずに済みます。この段階でやっつけで進めてしまうと後から綻びのたいおうに対応に追われて何倍も時間を使うことになります。 さて、この質問内容では何が問題なのかがわかりません。時間かけられないとか言いつつアカの他人にはエスパーしろというのは横暴ですよ。こういうところからですね、急がばまわれ。
退会済みユーザー

退会済みユーザー

2018/10/08 22:46

なるほど。
退会済みユーザー

退会済みユーザー

2018/10/08 23:09

自分勝手な発言申し訳ありませんでした。始めてまだペーペーで、質問のやり方を理解できていなかったです。今後は言葉を考えて投稿します。
m.ts10806

2018/10/08 23:11

質問は編集できるので適宜編集していただけたらと。「質問するときのヒント」も一度読まれると良いです。 https://teratail.com/help/question-tips
退会済みユーザー

退会済みユーザー

2018/10/08 23:14

ありがとうございます!
退会済みユーザー

退会済みユーザー

2018/10/08 23:19

一回質問内容を読み返して、また改めて質問したいのですがよろしいですか?
m.ts10806

2018/10/08 23:20

そこは誰にも許可をとる必要がないと思います。ただし「新規質問」にするのではなく、この質問を編集してください。未解決のままの質問が残り続けるのは質問者さんにとってもデメリットにしかなりませんので。
退会済みユーザー

退会済みユーザー

2018/10/08 23:33

分かりました
madoka9393

2018/10/09 01:15 編集

これだと「やってほしいことだけを記載した丸投げの質問」ですね。 「質問するときのヒント」を本当に読まれたのでしょうか…。 (丸投げは過言だとしても、せめて自分でここまではやってみたができなかった 等がないと丸投げと思われても仕方がないかと)
退会済みユーザー

退会済みユーザー

2018/10/09 01:30

一応ソースコード(中途半端ではありますが)を追加しました。今後、ネットのやり方を見てもわからずかつあまりソースコードのかけてない状態で、いろんな人からちゃんと1から教えてほしいときなどはどういった感じの質問にすればよいのですか?そういった質問は全部丸投げと思われるものなのでしょうか?
dice142

2018/10/09 02:08

質問文からは「上手く開発できないので1から教えてほしい」という意図に見えてしまうので「丸投げ」と思われてしまいます。コードを書いた結果何をしようとして詰まったのか、具体的に何を解決したいのかを質問文に書いていただけると回答しやすいです。
guest

回答2

0

こんな感じでupdate文を行うのであっているのか?

駄目

ユーザーの入力値は入った瞬間即検証する癖をつけよう。
それが終わるまではDBにSQLとして問い合わせるのはご法度。

以下のところでエラーの処理を書きたいのですがどう書いたらよいのかわかりません。

即刻res.renderを発火しつつ、
後続の処理が行われないようにreturnで閉じてね。

正規表現にかかわるエラー?(これは必要かどうかわからない)の3つだと思います。

これは自分で使えない文字を定義して、設計するものだから人に聞いちゃ駄目でしょ。
回答例のコードにコメントとしてぶら下げるから必要に応じて入れて。

関数は必要かなどを教えてはいただけないでしょうか?

煩わしくなりそうだから関数化して取り出しておくと捗ると思うけど、
エラーの内容に従って文言変えたくない?
もし変えたいなら結構難易度上がっちゃうんだよねぇ……
他の箇所でも流用したいか否かで決めよう、別に他の箇所で使うつもりが無いならベタっと書いた方がマシまである。


上記を踏まえてpassword_change.jsをレビューしていくよ。
ちょこちょこおかしいと思った箇所はツッコミをコメントとしてぶら下げたよ。

特にconnectionが未定義で致命的なので、
module.exportにrouterを代入するのはとりやめ、
connectionを要求する関数にして、戻り値をrouterに変更してる事に注意してね。

JavaScript

1const Router = require('express'); 2 3module.export = connection => { 4 const router = Router(); 5 6 router.get('/', (req, res, next) => { 7 res.render('password_change/index', { 8 name: req.session.user.name, 9 type: req.session.user.type 10 }); 11 }); 12 13 router.post('/', (req, res, next) => { 14 const password = req.body.password; 15 const new_pass = req.body.new_pass; 16 const confirm = req.body.confirm; 17 18 // バリデート処理 19 // user.passwordセッションがあるかは知らんけど多分あるように設計してるでしょ? 20 if (password !== req.session.user.password) { 21 res.render('pass_change', { 22 title: 'パスワード変更', 23 pass: 'パスワードが間違っています' 24 }); 25 return; 26 } 27 if (new_pass !== confirm) { 28 res.render('pass_change', { 29 title: 'パスワード変更', 30 pass: '新しいパスワードが新旧で異なります' 31 }); 32 return; 33 } 34 // 正規表現にかかわるエラーが必要ならこの箇所に差し込んでね 35 36 // これはDBのパスワードを直で書き換えてるけど大丈夫か? 37 const query = 'UPDATE user SET password = ? WHERE id = ?'; 38 connection.query(query, [pass_change, req.session.user.id], err => { 39 // 多くのケースでSQLの実行時エラーなのでレアケース 40 if (err) { 41 res.render('pass_change', { 42 title: 'パスワード変更', 43 pass: 'エラーが発生しましたので管理者にお問い合わせください' 44 }); 45 return; 46 } 47 res.render('pass_change', { 48 title: 'パスワード変更', 49 pass: 'パスワードの変更が完了しました' 50 }); 51 }); 52 }); 53 54 return router; 55}

呼び出し元をこうする

JavaScript

1const connection = // DBのコネクション 2 3// その他の宣言は省略 4 5app.use('/password_change', require('./password_change.js')(connection));

投稿2018/10/09 05:12

miyabi-sun

総合スコア21473

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/09 05:59

ここまで詳しく解説ありがとうございます! Node、jsをしっかり理解し、ちゃんと自分のものにしていきたいと思います。 Git部門も1位なんですね。もしかしてバージョン管理にはSorceTreeなんかを使用しているんですか?
miyabi-sun

2018/10/09 06:48

いいえ、初心者さんにはSorcetreeを進めますが、普段はGitコマンドを利用してますよ。
退会済みユーザー

退会済みユーザー

2018/10/09 07:24

なるほどありがとうございます
退会済みユーザー

退会済みユーザー

2018/10/09 15:22

夜分遅くにすいません! 呼び出し元のDBコネクションの意味がよくわからないのでそこの解説してもらっても大丈夫ですか? 時間のある時でよいのでお願いします
退会済みユーザー

退会済みユーザー

2018/10/09 22:41

さらに注意事項として書かれているconnection の部分についてもう少しだけ解説をお願いしてもよろしいでしょうか?
退会済みユーザー

退会済みユーザー

2018/10/09 23:15

すいません。注意事項に関してはもう少し自分で調べてみます。 コネクションの方は少しだけ解説お願いいたします!
miyabi-sun

2018/10/10 02:44

いやいや自分で「connection.query」って書いてるじゃん!これは何? 出展も何も書いてないじゃん。 connectionは既にDBにつながってて、queryというメソッドを持っているという表面的な情報しか私知らないよ。
guest

0

そもそも会員管理システムとしての設計上の問題がありそうです。

コードとして明確に現れていませんが
・生 password を保存してませんか?
・CSRF 対策するつもりありますか?
等々。

パスワード変更のような些事ではなくて、そもそも会員管理システムに必要とされる要件を整理してみてはいかがでしょうか。

投稿2018/10/09 23:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/10/09 23:33

パスワードは後々、ハッシュ化したものを保存するつもりでいます。 CSRF対策には、トークンを使った方法をとりあえず考えています。 言いたいことは十分伝わっています。一応2,3人チームを組んで開発してるのでそこに関しては、後で確認し合っていこうと考えています
退会済みユーザー

退会済みユーザー

2018/10/09 23:38

言いたいことは全く伝わってないけど、いろいろ試してみるのは経験として必要かもしれないですね。 がんばってください。
退会済みユーザー

退会済みユーザー

2018/10/09 23:38

色んなところで指摘を受けつつ 完成形へと近づけていくと考えています。少しイラつくかもしれませんが勘弁して下さい。
退会済みユーザー

退会済みユーザー

2018/10/09 23:43

最後に等に含まれる設計上の問題をもう少し具体的にお教えいただけないでしょうか?
退会済みユーザー

退会済みユーザー

2018/10/10 00:01

それは要件次第。そしてその要件に従った設計によります。 要は設計をしない状態で、コードに落としてもそのコードは無駄になるよって話です。 要件の方は省略しますが、たとえば最近だと、「重要な変更画面に入る前に再認証するようにする」なんて設計もありえますし、その場合、コードは今とはぜんぜん違うものになります。 今の状態に、パスワードのハッシュ値の比較、トークン検証の仕組みを導入するにしても、コードは全然変わりますし、DB の設計すら見直さなければなりません。 まぁ、経験してみることは重要です。私もいっぱい地雷踏み抜きましたw
退会済みユーザー

退会済みユーザー

2018/10/10 08:49

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問