質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Node.js

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

JavaScript

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

Express

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

Q&A

0回答

1645閲覧

SequelizeにてinstanceMethodsが機能しない

kaito3desuyo

総合スコア143

Node.js

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

JavaScript

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

Express

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

0グッド

1クリップ

投稿2017/12/11 15:14

編集2022/01/12 10:55

#前提

  • express v4.16.2
  • sequelize v4.22.13
  • passport v0.4.0
  • bcrypt v1.0.3

以上のミドルウェアを用いて、node.jsで開発を行っています。
CentOS 7上にnvmを用いてnode.jsをインストールし、npmも導入済みです。
#発生した問題
sequelizeのinstanceMethodsを公式に沿って定義したのですが、passport.useの中から読ませようとしてもundefinedになります。
やりたいこととしては、

instanceMethodsにbcryptでcompareした結果を返すメソッドを定義する

passportでログインする際に、パスワードをデータベースから引っ張ってくる

入力されたパスワードとデータベースのパスワードをbcryptでcompareする

という形です。

コードを以下に記載します。

ルーティング:

js

1router.post('/user/login', (req, res, next) => { 2 passport.authenticate('local-login', function(err, user){ 3 if (err) { return next(err); } 4 if (!user) { return res.send('/login'); } 5 req.logIn(user, function(err) { 6 if (err) { return next(err); } 7 return res.redirect('/users/' + user.username); 8 }); 9 })(req, res, next); 10});

これをaxiosを使ってajaxで叩いています。

passportのストラテジー設定

js

1const passport = require('passport'); 2const LocalStrategy = require('passport-local').Strategy; 3 4const db = require('./../db/models'); 5 6 7 passport.serializeUser(function(user, done) { 8 done(null, user.id); 9 }); 10 11 passport.deserializeUser(function(user, done) { 12 console.log(user.id); 13 db.User.findById(user.id).then(user => { 14 done(null, user); 15 }); 16 }); 17 18 19 passport.use('local-login', new LocalStrategy({ 20 usernameField: 'email', 21 passwordField: 'pass', 22 passReqToCallback: true 23 }, function(req, email, pass, done){ 24 25 // process.nextTick(() => { 26 27 db.User.findOne({where: {'email': email}}).then(user => { 28 console.dir(user); 29 console.log(user.auth(pass)); 30 if(!user){ 31 return done(null, false); 32 }else if(!user.auth(pass)){ 33 return done(null, false); 34 }else{ 35 return done(null, user); 36 } 37 }); 38 39 //}); 40 41 })); 42 43module.exports = passport;

データベースのモデル定義:

js

1'use strict'; 2import bcrypt from 'bcrypt'; 3 4module.exports = (sequelize, DataTypes) => { 5 var User = sequelize.define('User', { 6 name: DataTypes.STRING, 7 email: DataTypes.STRING, 8 password: DataTypes.STRING, 9 user_type: DataTypes.INTEGER, 10 authority: DataTypes.INTEGER, 11 api_key: DataTypes.STRING 12 }, { 13 hooks: { 14 beforeCreate: hashPasswordHook, 15 beforeUpdate: hashPasswordHook, 16 }, 17 classMethods: { 18 associate: function(models) { 19 // associations can be defined here 20 }, 21 } 22 }); 23 24 User.prototype.auth = function(password){ 25 bcrypt.compare(password, this.password, function(err, res){ 26 //console.log(res); 27 return res; 28 }); 29 }; 30 31 return User; 32}; 33 34function hashPasswordHook(user, options){ 35 if(user.password != undefined && user.password != "" && user.password != user.previous("password")){ 36 return bcrypt.hash(user.password, 10) 37 .then((hash) => { 38 user.password = hash; 39 }); 40 } 41};

以上よろしくお願いいたします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問