1

我正在尝试使用 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调用该方法时, is 的值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过)。

我做错了什么,和/或有另一种我在谷歌搜索中找不到的方法吗?谢谢!

4

1 回答 1

1

深入研究代码后,发现 node-orm 不支持这一点。我打开了一个问题,希望将其添加为功能,但我没有收到所有者的任何消息。

于 2014-08-31T16:04:45.353 回答