I defined my hook beforeCreate as following:
module.exports = function (sequelize, DataTypes) { var userSchema = sequelize.define('User', { // define... }); userSchema.beforeCreate(function (model) { debug('Info: ' + 'Storing the password'); model.generateHash(model.password, function (err, encrypted) { debug('Info: ' + 'getting ' + encrypted); model.password = encrypted; debug('Info: ' + 'password now is: ' + model.password); // done; }); }); };
and when I create a the model
User.create({ name: req.body.name.trim(), email: req.body.email.toLowerCase(), password: req.body.password, verifyToken: verifyToken, verified: verified }).then(function (user) { debug('Info: ' + 'after, the password is ' + user.password); }).catch(function (err) { // catch something });
Now what I get from this is
Info: Storing the password +6ms Info: hashing password 123123 +0ms // debug info calling generateHash() Executing (default): INSERT INTO "Users" ("id","email","password","name","verified","verifyToken","updatedAt","createdAt") VALUES (DEFAULT,'[email protected]','123123','wwx',true,NULL,'2015-07-15 09:55:59.537 +00:00','2015-07-15 09:55:59.537 +00:00') RETURNING *; Info: getting $2a$10$6jJMvvevCvRDp5E7wK9MNuSRKjFpieGnO2WrETMFBKXm9p4Tz6VC. +0ms Info: password now is: $2a$10$6jJMvvevCvRDp5E7wK9MNuSRKjFpieGnO2WrETMFBKXm9p4Tz6VC. +0ms Info: after, the password is 123123 +3ms
It seems that every part of the code is working. Creating a user schema will invoke beforeCreate, which properly generates the hash code for the password.... except it didn't write to the database!
I'm certain that I'm missing a very important and OBVIOUS piece of code, but I just can't find where the problem is (aghh). Any help appreciated!
Models can be defined in two equivalent ways in Sequelize: Calling sequelize.define(modelName, attributes, options) Extending Model and calling init(attributes, options)
With this call, Sequelize will automatically perform an SQL query to the database and create a table, printing the message Book table created successfully! . As mentioned, the sync() method is a promise-based method, which means it can also perform error handling.
Hooks are called in an asynchronous fashion in Sequelize, so you need to call the completion callback when you're done:
userSchema.beforeCreate(function(model, options, cb) { debug('Info: ' + 'Storing the password'); model.generateHash(model.password, function(err, encrypted) { if (err) return cb(err); debug('Info: ' + 'getting ' + encrypted); model.password = encrypted; debug('Info: ' + 'password now is: ' + model.password); return cb(null, options); }); });
(alternatively, you can return a promise from the hook)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With