2015-12-06 16 views
8

Tôi đang cố gắng sử dụng gói bcrypt-nodejs với mô hình tiếp theo của mình và được thực hiện theo hướng dẫn để kết hợp băm vào mô hình của tôi, nhưng tôi gặp lỗi tại generateHash. Tôi dường như không thể tìm ra vấn đề. Có cách nào tốt hơn để kết hợp bcrypt?Sử dụng BCrypt với Mô hình liên kết

Lỗi:

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

mô hình:

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

Chỉ cần lưu ý: trước khi bạn triển khai điều này, hãy thử và sử dụng [mô-đun bcrypt gốc] (https://www.npmjs.com/package/bcrypt) thay vì mô-đun bcrypt-nodejs. Điều này sẽ tăng tốc độ băm lên rất nhiều bởi vì nó được thực hiện trong C++ thay vì JavaScript. – leroydev

Trả lời

8

Phương pháp should be cung cấp trong "Tùy chọn" đối số của 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 đề xuất chế độ không đồng bộ: https://github.com/kelektiv/node.bcrypt.js#why-is-async-mode-recommended-over-sync-mode – alditis

+0

cập nhật để sử dụng các phương thức không đồng bộ bcrypt – Louy

+0

Có vẻ như điều quan trọng là chú ý đến phiên bản phần tiếp theo bạn đang sử dụng ở đây (3 so với 4). Trong v4 có một cách mới để định nghĩa các Phương thức Instance trên mô hình: http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html#breaking-changes –

3

thay thế khác: Sử dụng móc và bcrypt async chế độ

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

    return bcrypt.hash(user.password, 10) 
     .then(hash => { 
      user.password = hash; 
     }) 
     .catch(err => { 
      throw new Error(); 
     }); 
}); 
Các vấn đề liên quan