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

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

ただいまの
回答率

91.04%

  • JavaScript

    13344questions

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

  • Node.js

    1492questions

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

  • Express

    171questions

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

SequelizeにてinstanceMethodsが機能しない

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 123

kaito3desuyo

score 1

前提

  • 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する

という形です。

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

ルーティング:

router.post('/user/login', (req, res, next) => {
    passport.authenticate('local-login', function(err, user){
        if (err) { return next(err); }
        if (!user) { return res.send('/login'); }
        req.logIn(user, function(err) {
            if (err) { return next(err); }
            return res.redirect('/users/' + user.username);
        });
    })(req, res, next);
});


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

passportのストラテジー設定

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;

const db = require('./../db/models');


    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    passport.deserializeUser(function(user, done) {
        console.log(user.id);
        db.User.findById(user.id).then(user => {
            done(null, user);
        });
    });


    passport.use('local-login', new LocalStrategy({
        usernameField: 'email',
        passwordField: 'pass',
        passReqToCallback: true
    }, function(req, email, pass, done){

        // process.nextTick(() => {

            db.User.findOne({where: {'email': email}}).then(user => {
                console.dir(user);
                console.log(user.auth(pass));
                if(!user){
                    return done(null, false);
                }else if(!user.auth(pass)){
                    return done(null, false);
                }else{
                    return done(null, user);
                }
            });

        //});

    }));

module.exports = passport;

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

'use strict';
import bcrypt from 'bcrypt';

module.exports = (sequelize, DataTypes) => {
  var User = sequelize.define('User', {
    name: DataTypes.STRING,
    email: DataTypes.STRING,
    password: DataTypes.STRING,
    user_type: DataTypes.INTEGER,
    authority: DataTypes.INTEGER,
    api_key: DataTypes.STRING
  }, {
    hooks: {
        beforeCreate: hashPasswordHook,
        beforeUpdate: hashPasswordHook,
    },
    classMethods: {
      associate: function(models) {
        // associations can be defined here
      },
    }
  });

  User.prototype.auth = function(password){
      bcrypt.compare(password, this.password, function(err, res){
           //console.log(res);
           return res;
      });
  };

  return User;
};

function hashPasswordHook(user, options){
    if(user.password != undefined && user.password != "" && user.password != user.previous("password")){
        return bcrypt.hash(user.password, 10)
        .then((hash) => {
            user.password = hash;
        });
    }
};

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

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

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

  • ただいまの回答率 91.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • JavaScript

    13344questions

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

  • Node.js

    1492questions

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

  • Express

    171questions

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