2015-12-06 2 views
8

Я пытаюсь использовать пакет bcrypt-nodejs с моей моделью sequelize и пытался выполнить урок, чтобы включить хеширование в мою модель, но я получаю сообщение об ошибке generateHash. Кажется, я не могу понять эту проблему. Есть ли лучший способ включить bcrypt?Использование BCrypt с Sequelize Model

Ошибка:

/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) 

модель:

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

Только примечание: перед развертыванием, попробуйте и использовать [собственный модуль Bcrypt] (https://www.npmjs.com/package/bcrypt) вместо Bcrypt-nodejs модуля. Это ускорит хеширование, потому что оно реализовано на C++ вместо JavaScript. – leroydev

ответ

8

Методы should be представлены в "опции" аргумент 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 рекомендует режим async: https://github.com/kelektiv/node.bcrypt.js#why-is-async-mode-recommended-over-sync-mode – alditis

+0

обновлен для использования методов асинхронного использования bcrypt – Louy

+0

Похоже, что важно обратите внимание на ту версию Sequelize, которую вы используете здесь (3 против 4). В версии 4 есть новый способ определения методов экземпляра для модели: http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html#breaking-changes –

3

Другая альтернатива: Используйте крюк и Bcrypt асинхронном режим

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

    return bcrypt.hash(user.password, 10) 
     .then(hash => { 
      user.password = hash; 
     }) 
     .catch(err => { 
      throw new Error(); 
     }); 
}); 
Смежные вопросы