【问题标题】:Sequelize instance methods beforeCreate HooksSequelize 实例方法 beforeCreate Hooks
【发布时间】:2016-04-12 17:51:12
【问题描述】:

我试图在存储到 Postgres 之前对图片进行编码,我在 Sequelize 中这样定义了我的模型:

var request = require('request');
module.exports = function (sequelize, DataTypes) {
    var Show = sequelize.define('Show',{
        name: DataTypes.STRING,
        genre: DataTypes.ARRAY(DataTypes.STRING),
        status: DataTypes.STRING,
        poster: DataTypes.TEXT
    }, {
        associate: function (models) {
            Show.hasMany(models.Episode)
            .hasMany(models.User)
        }
    }, {
        instanceMethods: {
            encodePoster : function (poster, done) {
                var url = 'http://thetvdb.com/banners/' + poster;
                request({url: url, encoding: null}, function (err, response, body) {
                    encodedpost = 'data:'+response.headers['content-type']+';base64,' + body.toString('base64');
                    done(err, encodedpost);
                });
            }
        }
    })
    Show.beforeCreate(function (model, done) {
        model.encodePoster(model.poster, function (err, encoded) {
            if (err) return done(err);
            model.poster = encoded;
            done();
        })
    })
    return Show;
}

我收到以下错误:

c:\Users\London\Apps\showtrackr\models\show.js:37
                model.encodePoster(model.poster, function (err, encoded) {
                      ^
TypeError: Object [object Object] has no method 'encodePoster'
    at null.<anonymous> (c:\Users\London\Apps\showtrackr\models\show.js:37:9)
    at method (c:\Users\London\Apps\showtrackr\node_modules\Sequelize\lib\hooks.js:80:8)
    at run (c:\Users\London\Apps\showtrackr\node_modules\Sequelize\lib\hooks.js:53:10)
    at Hooks.runHooks (c:\Users\London\Apps\showtrackr\node_modules\Sequelize\lib\hooks.js:65:3)
    at null.<anonymous> (c:\Users\London\Apps\showtrackr\node_modules\Sequelize\lib\dao.js:390:24)
    at emit (events.js:95:17)
    at module.exports.CustomEventEmitter.emit (c:\Users\London\Apps\showtrackr\node_modules\Sequelize\lib\emitters\custom-event-emitter.js:61:33)
    at null.<anonymous> (c:\Users\London\Apps\showtrackr\node_modules\Sequelize\lib\dao-validator.js:123:17)
    at Hooks.runHooks (c:\Users\London\Apps\showtrackr\node_modules\Sequelize\lib\hooks.js:41:15)
    at null.<anonymous> (c:\Users\London\Apps\showtrackr\node_modules\Sequelize\lib\dao-validator.js:118:29)

由于某种原因,它似乎无法识别我的实例方法?!! 看起来很奇怪,因为我有一个用户模型,它使用相同的钩子来加密密码并且工作正常,这是用户模型进行比较:

var bcrypt = require('bcrypt-nodejs');
module.exports = function (sequelize, DataTypes) {
    var User = sequelize.define('User',{
        email: DataTypes.STRING,
        password: DataTypes.STRING 
    },{
        associate: function (models) {
            User.hasMany(models.Show)
        }
    },{
        instanceMethods: {
            generateHash : function (password, done) {
                bcrypt.genSalt(10, function (err, salt) {
                    bcrypt.hash(password, salt, null, done); 
                });
            },
            validPassword : function (password, next) {
                bcrypt.compare(password, this.password, next)
            }
        }
    })
    User.beforeCreate(function (model, done) {
        model.generateHash(model.password, function (err, encrypted) {
            if (err) return done(err);
            model.password = encrypted;
            done();
        })
    })
    return User;
}

【问题讨论】:

    标签: node.js postgresql hook sequelize.js


    【解决方案1】:

    您可以使用如下定义的beforeCreate 挂钩

    hooks: {
      beforeCreate:function(show, options, cb) {
        var url = 'http://thetvdb.com/banners/' + show.poster;
         request({url: url, encoding: null}, function (err, response, body) {
          if (err) return cb(err);
          encodedpost = 'data:'+response.headers['content-type']+';base64,' + body.toString('base64');
          show.poster = encodedpost;
          cb(null, options);
        });
      }
    }
    

    【讨论】:

      【解决方案2】:

      实例方法仅适用于模型的实例,例如

      User.create({
          name : "foobar"
      })
      .then(function (userInstance){
          userInstance.encodePoster()
      });
      

      为了能够做到User.encodePoster(),您需要将encodePoster 设为class method

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-26
        • 2016-09-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多