如何在sequelize上使用实例方法

时间:2017-03-16 14:48:52

标签: javascript sql ecmascript-6 sequelize.js

有人可以帮我弄清楚如何在我的控制器上使用我的sequelize实例方法吗?

我这样写了我的模型:

const bcrypt = require('bcryptjs');

module.exports = (sequelize, Sequelize) => {
  const Patient = sequelize.define('Patient', {
    email: { 
      type: Sequelize.STRING,
      allowNull: false,
    },
    password : { 
      type: Sequelize.STRING,
      allowNull: false,
    },
  }, {
    classMethods: {
      associate: (models) => {
        // associations can be defined here
      }
    },
    instanceMethods: {
      generateHash: function (password) {
                  return bcrypt.hash(password, 8, function(err, hash){
                      if(err){
                          console.log('error'+err)
                      }else{
                          return hash;
                      }
                  });
              },
      validPassword: function(password) {
          return bcrypt.compareSync(password, this.password);
      }        
    }
  });
  return Patient;
};

但是当我在我的控制器上启动它时,我就这样做了

const jwt = require('jsonwebtoken');
const passport = require('passport');
const Patient = require('../models').Patient;

module.exports = {
///
  create(req, res) {
    return Patient
      .create({
        email: req.body.email,
        password: Patient.prototype.generateHash(req.body.password)
      })
      .then(patient => res.status(201).send(patient))
      .catch(error => res.status(400).send(error));
  },
};

我收到了请求的错误:

  

TypeError:无法读取属性' generateHash'未定义的

1 个答案:

答案 0 :(得分:0)

首先,您应该使用bcrypt.hashSync(),因为您想要为password分配异步函数调用 - 它不会起作用。

generateHash: function(password){
    try {
        return bcrypt.hashSync(password, 8);
    } catch (e) {
        console.log('error: ' + e);
    }
}

为了使用实例方法,你应该做

Patient.build().generateHash(req.body.password);

build()创建新的模型实例,然后您可以运行实例方法。或者您可以将generateHash声明为类方法,以便您可以像那样运行它

Patient.generateHash(req.body.password);