2016-12-05 3 views
1

Ich versuche, eine Benutzeranmeldung und Registrierung mit dem ORM Sequelize in Node einzurichten. Ich habe den Registrierungsteil gut funktioniert. Meine Modellinstanz wird als Benutzer definiert, und wenn ich User.createUser aufruft, funktioniert meine Modellfunktion, und der Datenbank wird ein Benutzer hinzugefügt. Wenn ich jedoch versuche, meine getUserNameById-Funktion in meiner lokalen Pass-Strategie zu verwenden, erhalte ich die Fehlermeldung "Benutzer ist nicht definiert". Ich bin seit über einem Tag festgefahren, um das herauszufinden.Warum ist mein Sequelize-Modell nur dann undefiniert, wenn ich versuche, Suchfunktionen zu verwenden?

Modell-Datei (Ich habe importiert sequelize, bcrypt und erstellt eine Verbindung)

var Users = connection.define("Users", { 
    id: { 
     type: Sequelize.INTEGER, 
     primaryKey: true, 
     autoIncrement: true, 
    }, 
    name: { 
     type: Sequelize.STRING 
    }, 
    username: { 
     type: Sequelize.STRING 
    }, 
    account: { 
     type: Sequelize.STRING 
    }, 
    email: { 
     type: Sequelize.STRING 
    }, 
    password: { 
     type: Sequelize.STRING 
    }, 

}, { 
    timestamps: false 
}); 


Users.sync(); 

connection.authenticate() 
    .then(function() { 
     console.log("CONNECTED! "); 
    }) 
    .catch(function (err) { 
     console.log("MYSQL ERROR: FAILED TO CONNECT"); 
    }) 
    .done(); 



module.exports = function (connection, DataTypes) { 
    return Users; 
} 


module.exports.createUser = function (newUser) { 
    bcrypt.genSalt(10, function(err, salt) { 
     bcrypt.hash(newUser.password, salt, function(err, hash) { 
      newUser.password = hash; 
      Users.create(newUser).then(function (Users){ 
       console.dir(Users.get()); 
      }) 
     }); 
    }); 
} 

module.exports.getUserByUsername = function (username) { 
    return Users.find({ 
     where: {username: username} 
    }).then(function (user) {}, function (err) { 
      console.log(err); 
    }); 
} 


module.exports.comparePassword = function(candidatePassword, hash, done, user){ 
    bcrypt.compare(password, hash, function(err, isMatch){ 
     if (err) console.log(err) 
     if (isMatch) { 
      return done(null, user) 
     } else { 
      return done(null, false) 
     } 
    }); 
} 



module.exports.getUserById = function(id, callback){ 
    Users.findAll({ 
     where: {id: id} 
    }); 
} 

Meine Route Code, insbesondere die lokale Pass Strategie, die ich Mühe, mich mit

var User = require("../models/users"); 
var express = require('express'); 
var router = express.Router(); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

passport.use(new LocalStrategy(
    function (username, password, done) { 
     User.getUserByUsername(username, function (user) { 
      if(!user){ 
       return done(null, false, {message:'Incorrect username'}) 
      } 
     }) 
     User.comparePassword(password, user.password, function (err, isMatch) { 
      if(err) throw err; 
      if(isMatch){ 
       return done(null, user); 
      }else{ 
       return done(null, false, {message: 'Invalid password'}); 
      } 
     }) 
    } 
)); 

Antwort

0

Ihre ./models/user Klasse exportiert eine Funktion, die die connection und DataTypes als Argumente übernimmt, aber Sie nicht übergeben - die Verbindung sollte durchlaufen werden. Sie sollten nicht connection.authenticate() anrufen müssen.

// new db connection 
var connection = new Sequelize(
    schema, 
    username, 
    password, 
    { 
     host: host, 
     dialect: dialect, 
    } 
) 
var DataTypes = // define DataTypes 

// pass into User 
var User = require("../models/users")(connection, DataTypes); 
Verwandte Themen