一尘不染

使用beforeCreate挂钩续集创建模型

node.js

我将钩子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,'wwx@test.com','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,它将正确生成密码的哈希码....,但它没有写入数据库!

我确定我错过了非常重要且显而易见的代码,但我只是找不到问题所在(啊)。任何帮助表示赞赏!


阅读 208

收藏
2020-07-07

共1个答案

一尘不染

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

(或者,您可以从挂钩中返回一个承诺)

2020-07-07