2015-12-06 6 views
8

के साथ बीयर्रीप्ट का उपयोग करके मैं अपने अनुक्रम मॉडल के साथ bcrypt-nodejs पैकेज का उपयोग करने की कोशिश कर रहा हूं और मेरे मॉडल में हैशिंग को शामिल करने के लिए एक ट्यूटोरियल का पालन करने की कोशिश कर रहा था, लेकिन मुझे generateHash पर एक त्रुटि मिल रही है। मुझे इस मुद्दे को समझने की प्रतीत नहीं हो रही है। क्या बीक्रिप्ट को शामिल करने का कोई बेहतर तरीका है?सीक्वेलिज मॉडल

त्रुटि:

/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 मॉड्यूल के बजाय का उपयोग करें। यह हैशिंग को बहुत तेज करेगा क्योंकि इसे जावास्क्रिप्ट के बजाय सी ++ में कार्यान्वित किया गया है। – leroydev

उत्तर

8

तरीके should besequelize.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 async विधियों का उपयोग करने के लिए अद्यतन – Louy

+0

ऐसा लगता है कि यह महत्वपूर्ण है Sequelize के किस संस्करण पर आप इसका उपयोग कर रहे हैं पर ध्यान दें (3 बनाम 4)। V4 में मॉडल पर इंस्टेंस विधियों को परिभाषित करने का एक नया तरीका है: http://docs.sequelizejs.com/manual/tutorial/upgrade-to-v4.html#breaking-changes –

3

अन्य विकल्प की "विकल्प" तर्क में उपलब्ध कराई गई: उपयोग हुक और bcrypt async मोड

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

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