2015-12-06 14 views
8

Sto cercando di utilizzare il pacchetto bcrypt-nodejs con il mio modello sequelize e ho cercato di seguire un tutorial per incorporare l'hashing nel mio modello, ma sto ricevendo un errore su generateHash. Non riesco a capire il problema. C'è un modo migliore per incorporare bcrypt?Utilizzo di BCrypt con Sequenza modello

Errore:

/Users/user/Desktop/Projects/node/app/app/models/user.js:26 
User.methods.generateHash = function(password) { 
         ^
TypeError: Cannot set property 'generateHash' of undefined 
    at module.exports (/Users/user/Desktop/Projects/node/app/app/models/user.js:26:27) 
    at Sequelize.import (/Users/user/Desktop/Projects/node/app/node_modules/sequelize/lib/sequelize.js:641:30) 

modello:

var bcrypt = require("bcrypt-nodejs"); 

module.exports = function(sequelize, DataTypes) { 

var User = sequelize.define('users', { 
    annotation_id: { 
     type: DataTypes.INTEGER, 
     autoIncrement: true, 
     primaryKey: true 
    }, 
    firstName: { 
     type: DataTypes.DATE, 
     field: 'first_name' 
    }, 
    lastName: { 
     type: DataTypes.DATE, 
     field: 'last_name' 
    }, 
    email: DataTypes.STRING, 
    password: DataTypes.STRING, 

}, { 
    freezeTableName: true 
}); 

User.methods.generateHash = function(password) { 
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null); 
}; 

User.methods.validPassword = function(password) { 
    return bcrypt.compareSync(password, this.local.password); 
}; 
    return User; 
} 
+0

Solo una nota: prima di distribuire questo, cercare di utilizzare il [modulo bcrypt nativa] (https://www.npmjs.com/package/bcrypt) al posto del modulo bcrypt-nodejs. Ciò velocizzerà molto l'hashing perché è implementato in C++ anziché JavaScript. – leroydev

risposta

8

Metodi should be previsto nel "opzioni" argomento di sequelize.define

const bcrypt = require("bcrypt"); 

module.exports = function(sequelize, DataTypes) { 
    const User = sequelize.define('users', { 
     annotation_id: { 
      type: DataTypes.INTEGER, 
      autoIncrement: true, 
      primaryKey: true 
     }, 
     firstName: { 
      type: DataTypes.DATE, 
      field: 'first_name' 
     }, 
     lastName: { 
      type: DataTypes.DATE, 
      field: 'last_name' 
     }, 
     email: DataTypes.STRING, 
     password: DataTypes.STRING 
    }, { 
     freezeTableName: true, 
     instanceMethods: { 
      generateHash(password) { 
       return bcrypt.hash(password, bcrypt.genSaltSync(8)); 
      }, 
      validPassword(password) { 
       return bcrypt.compare(password, this.password); 
      } 
     } 
    }); 

    return User; 
} 
+1

bcrypt consiglia la modalità asincrona: https://github.com/kelektiv/node.bcrypt.js#why-is-async-mode-recommended-over-sync-mode – alditis

+0

aggiornato per utilizzare i metodi bcrypt async – Louy

+0

Sembra che sia importante fai attenzione a quale versione di Sequelize stai usando qui (3 vs 4). In v4 c'è un nuovo modo di definire i metodi di istanza sul modello: http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html#breaking-changes –

3

Altro alternativa: con il gancio e bcrypt asincrone modalità

User.beforeCreate((user, options) => { 

    return bcrypt.hash(user.password, 10) 
     .then(hash => { 
      user.password = hash; 
     }) 
     .catch(err => { 
      throw new Error(); 
     }); 
});