2016-12-09 18 views
3

私はSequelizeでプロジェクトを作成していますが、私はこの手順に固執しています。問題は、ログインしようとすると、パスポートのローカルコードが実行され、がUser.findAll(...)に到達すると、findAllは関数ではないことになります。Sequelize findAllは関数ではありません

console.log(User)を作成すると、[function]と表示されます。

マイ構造:

  • /config/config.js
  • /config/passport.js
  • /models/index.js
  • sequelize-autoによって生成/models/nuke_users.js( )
  • /index.js

あるconfig.js:

//Setting up the config 
var Sequelize = require('sequelize'); 
var sequelize = new Sequelize('rocarenav2', 'root', '123456', { 
    host: "localhost", 
    port: 3306, 
    dialect: 'mysql' 
}); 

module.exports = sequelize; 

passport.js:

// config/passport.js 

// load all the things we need 
var LocalStrategy = require('passport-local').Strategy; 

// load up the user model 
var User   = require('../models/nuke_users'); 

var crypto   = require('crypto'); 

function hashPasswordForNuke(password) { 
    return md5password =  crypto.createHash('md5').update(password).digest('hex'); 
} 

// expose this function to our app using module.exports 
module.exports = function(passport) { 

// ========================================================================= 
// passport session setup ================================================== 
// ========================================================================= 
// required for persistent login sessions 
// passport needs ability to serialize and unserialize users out of session 

// used to serialize the user for the session 
passport.serializeUser(function(user, done) { 
    done(null, user.id); 
}); 

// used to deserialize the user 
passport.deserializeUser(function(id, done) { 
    User.findById(id, {}) 
    .then(function (user) { 
     done(err, user); 
    }) 
    .catch(function (error){ 
     done(error); 
    }); 
}); 



// ========================================================================= 
// LOCAL LOGIN ============================================================= 
// ========================================================================= 
// we are using named strategies since we have one for login and one for signup 
// by default, if there was no name, it would just be called 'local' 

passport.use('local-login', new LocalStrategy({ 
    // by default, local strategy uses username and password, we will override with email 
    usernameField : 'email', 
    passwordField : 'password', 
    passReqToCallback : true // allows us to pass back the entire request to the callback 
}, 
function(req, email, password, done) { // callback with email and password from our form 
    User.findAll({ 
     where: { 
      'user_email': email 
     } 
    }).then(function (user) { 
     if(!user) 
      return done(null, false, req.flash('loginMessage', 'No user found.')); // req.flash is the way to set flashdata using connect-flash 

     // if the user is found but the password is wrong 
     if ((user.user_password).localeCompare(hashPasswordForNuke(password)) === -1) 
      return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); // create the loginMessage and save it to session as flashdata 

     return done(null, user); 
    }) 
    .catch(function (error){ 
     done(error); 
    }); 

})); 

}; 

モデル/ index.js

'use strict'; 

var fs  = require('fs'); 
var path  = require('path'); 
var Sequelize = require('sequelize'); 
var basename = path.basename(module.filename); 
var config = require(__dirname + '/../config/config'); 
var db  = {}; 

//Create a Sequelize connection to the database using the URL in   config/config.js 
var sequelize = config; 

//Load all the models 
fs 
    .readdirSync(__dirname) 
    .filter(function(file) { 
     return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); 
}) 
.forEach(function(file) { 
    var model = sequelize['import'](path.join(__dirname, file)); 
    db[model.name] = model; 
}); 

Object.keys(db).forEach(function(modelName) { 
    if (db[modelName].associate) { 
     db[modelName].associate(db); 
    } 
}); 

//Export the db Object 
db.sequelize = sequelize; 
db.Sequelize = Sequelize; 

module.exports = db; 

/models/nuke_users.js

/* jshint indent: 2 */ 

module.exports = function(sequelize, DataTypes) { 
return sequelize.define('nuke_users', { 
    user_id: { 
     type: DataTypes.INTEGER(11), 
     allowNull: false, 
     primaryKey: true, 
     autoIncrement: true 
    }, 
    username: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     defaultValue: "", 
     references: { 
     model: 'reps_table', 
     key: 'PostName' 
     } 
    }, 
    user_email: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     defaultValue: "" 
    }, 
    user_avatar: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     defaultValue: "" 
    }, 
    user_password: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     defaultValue: "" 
    } 
}, { 
    tableName: 'nuke_users' 
}); 
}; 

/index.js

... 
var models = require('./models/'); 
... 

どうしたのですか?

+1

は=は(」../モデル)が必要です VARモデルのようにそれをやろう。 var User = models.nuke_users; –

+1

さて、それはうまくいった。 答えを正しいとマークするにはどうすればよいですか? –

+0

心配しないでください。私はあまりにも疲れて正しく答えることができませんでした。 –

答えて

4

nuke_usersモジュールは、呼び出されたときにModelを返す関数をエクスポートしています。この関数を呼び出さないため、Modelが返されないため、探している関数が存在しません。あなたはindex.jsファイルにローダーを使用している、あなたの場合は

var User = require('../models/nuke_users')(sequelize, DataTypes); 

、それはdbをエクスポートしている:

はそうと、あなたが sequelizeインスタンスと DataTypesに合格する必要があるだろう、このエクスポートされた関数を呼び出すにはその名前でモデル化されたモデルを含むオブジェクト。あなたのpassport.jsで

var models = require('../models'); // loads index.js 
var User = models.nuke_user;  // the model keyed by its name 
User.findOne(...);     // search the model 
+0

+100人。これは私に多くの時間を節約した –

関連する問題