如何在node-orm中定义虚拟属性?

时间:2014-08-24 23:09:41

标签: node.js orm virtual-attribute node-orm2

我正在尝试使用node-orm设置用户表,我想定义password& passwordConfirmation作为虚拟属性(即:未保存,仅用于验证和计算)以及encryptedPassword,它实际上已保存到数据库中。据我所知,这似乎并未包含在包中。

作为一种解决方法,我正在尝试使用Object.defineProperties,但我无处可去。这是我到目前为止所获得的相关代码。

var User = db.define('user', {
  id                : { type: 'serial', key: true },
  email             : { type: 'text', required: true, unique: true },
  encryptedPassword : { type: 'text', required: true, mapsTo: 'encrypted_password' }
}, {
  hooks: {
    beforeValidation: function (next) {
      this.encryptPassword(function (err, hash) {
        if (err) return next(err);

        this.encryptedPassword = hash;
        next();
      }.bind(this));
    }
  },

  validations: {
    password: [
      orm.enforce.security.password('6', 'must be 6+ characters')
    ],
    passwordConfirmation: [
      orm.enforce.equalToProperty('password', 'does not match password')
    ]
  },

  methods: {
    encryptPassword: function (callback) {
      bcrypt.hash(this.password, config.server.salt, callback);
    }
  }
});

Object.defineProperties(User.prototype, {
  password: {
    writable: true,
    enumerable: true
  },
  passwordConfirmation: {
    writable: true,
    enumerable: true
  }
});

然后我尝试通过以下方式创建用户:

var params = require('params');  // https://github.com/vesln/params

app.post('/register', function (req, res, next) {
  req.models.user.create([ userParams(req.body) ], function (err, users) {
    // post-create logic here
  });
});

function userParams(body) {
  return params(body).only('email', 'password', 'passwordConfirmation');
};

我遇到的问题是调用bcrypt.hash方法时,this.password的值为undefined,导致它抛出此错误:

{ [Error: data and salt arguments required]
  index: 0,
  instance: 
   { id: [Getter/Setter],
     email: [Getter/Setter],
     encryptedPassword: [Getter/Setter] } }

似乎password属性没有通过我的create调用设置,所以我假设它是因为node-orm2没有传递自定义属性值,或者我已经定义了错误的属性(可能因为我之前没有真正使用过Object.defineProperties)。

我做错了什么,和/或是否有其他方式可以做到这一点,我似乎无法在谷歌搜索中找到?谢谢!

1 个答案:

答案 0 :(得分:1)

在深入研究代码后,结果发现node-orm不支持​​这一点。我opened an issue希望将其添加为一个功能,但我没有收到所有者的任何消息。