2015-08-25 13 views
9

Podążam za dokumentem passport.js, aby utworzyć LocalStrategy za pomocą Sequelize jako ORM dla mojej bazy danych postgres. Jednak podczas uwierzytelniania wpisanie User.findOne(...).success(function(user){...]}); w moim module login.js zwraca undefined. Co ja robię źle?Sequelize - findOne(). Success() jest undefined

user.js:

var pg = require('pg'); 
var Sequelize = require('sequelize'); 

var sequelize = new Sequelize('database', 'username', 'password', { 
    host: 'localhost', 
    port: 5432, 
    dialect: 'postgres' 
}); 

var User = sequelize.define('users', { 
    username: Sequelize.STRING, 
    password: Sequelize.STRING 

}); 

User.sync(); 

module.exports = User; 

moi login.js (routera)

var express = require('express'); 
var router = express.Router(); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 


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

passport.deserializeUser(function(id, done){ 
    console.log(id) 
    User.findById(id, function(err, user){ 
     done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(
    function(username, password, done){ 
     var User = require('../models/user'); 
     User.find({where:{username: username, password: password}}).success(function(user){ 
      if(!user) { 
       return done(null, false, {message: 'Nom d\'usager incorrect.' }); 
      } 
      if (!user.validPassword(password)) { 
       return done(null, false, { message: 'Mot de passe incorrect.' }); 
      } 
      return done(null, user); 
     }); 
    } 
)); 

router.post('/login', passport.authenticate('local', { successRedirect: '/decoupage', 
                 failureRedirect: '/login', 
                 failureFlash: true }) 
); 


module.exports = router; 
+0

Należy przyjąć wich @robertklep odpowiedź jest poprawna. –

Odpowiedz

17

Sequelize używa zmodyfikowanej wersji biblioteki bluebird obietnica, która nie posiada .success() funkcję.

Zamiast używać .then() (który również jest zgodny ze standardowym Promises/A+):

User.find(options).then(
    function(user) { ... }, 
    function(err) { ... } 
); 
+0

co powinniśmy użyć, aby złapać błąd? – abhishek

+2

@abhishek, aktualne wersje 'sequelize' używają wersji" bluebird ". Aby złapać błędy, użyj '.catch' lub' .error'. Dokumentacja znajduje się [tutaj] (http://bluebirdjs.com/docs/api-reference.html). –