Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sequelize create model with beforeCreate hook

Tags:

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!

like image 302
Alon Avatar asked Jul 15 '15 10:07

Alon


People also ask

How do you define a model in Sequelize?

Models can be defined in two equivalent ways in Sequelize: Calling sequelize.define(modelName, attributes, options) Extending Model and calling init(attributes, options)

Does Sequelize automatically create table?

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.


1 Answers

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)

like image 83
robertklep Avatar answered Sep 22 '22 07:09

robertklep