2015-07-15 2 views
14

Я определил мой крюк beforeCreate следующим образом:Sequelize создать модель с beforeCreate крючком

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; 
    }); 
    }); 
}; 

и когда я создаю модель

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 
    }); 

Теперь то, что я получаю от этого

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 

Кажется, что каждая часть кода работает. Создание пользовательской схемы вызовет beforeCreate, который правильно генерирует хеш-код для пароля .... кроме того, что он не писал в базу данных!

Я уверен, что у меня отсутствует очень важная и OBVIOUS часть кода, но я просто не могу найти, где проблема (aghh). Любая помощь ценится!

ответ

25

Крючки называются в асинхронном режиме в Sequelize, так что вам нужно вызвать завершение обратного вызова, когда вы закончите:

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); 
    }); 
}); 

(в качестве альтернативы, вы можете вернуть обещание от крючка)

+1

это работает! sry не может +1 из-за низкой репутации .... – Alon

+0

@ user2242178 не волнуйтесь, рад слышать, что он решил вашу проблему :-) – robertklep

+0

Спасибо. Я не видел этого в документации, связанной с продолжением, и это мешало моему серверу отвечать. – Danielo515

3

Для более новых версий Sequelize, у крючков больше нет функций обратного вызова, кроме обещаний. Поэтому код будет выглядеть следующим образом:

userSchema.beforeCreate(function(model, options) { 
    debug('Info: ' + 'Storing the password'); 

    return new Promise ((resolve, reject) => { 
     model.generateHash(model.password, function(err, encrypted) { 
      if (err) return reject(err); 
      debug('Info: ' + 'getting ' + encrypted); 

      model.password = encrypted; 
      debug('Info: ' + 'password now is: ' + model.password); 
      return resolve(model, options); 
     }); 
    }); 
}); 
+0

Поддерживает ли функции асинхронного/ожидающего поддержки функции в крючках модели? – Jadex1

+0

Асинхронные/ожидающие функции arent, реализованные в узел, но когда вы пишете Async/Await, он передается обратно в обещания от Babel – Rene

+0

Я думал, что async/await был выпущен с узлом 8 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Выражения/async_function Я не использую babel в моем проекте, и мой код компилируется с помощью функций async/await. u объясните пожалуйста? – Jadex1

Смежные вопросы