猫鼬模式续集模型

Ame*_*nzO 9 mysql mongoose mongodb node.js sequelize.js

我用mongodb(猫鼬作为 ODM)制作了一个应用程序,但现在我想使用MySQL(工作义务),所以我Sequelize为此采用了模块,但我真的不明白如何将我的 userSchema 转换为用户模型及其所有方法(我'米,工作passportJs进行身份验证,所以我有一些方法,我使用例如setpassword ...)

这里我的 userSchema (mongoose) 工作得很好。

var mongoose = require('mongoose');
var crypto = require('crypto');
var jwt = require('jsonwebtoken');
var validator = require('node-mongoose-validator');
var Schema = mongoose.Schema;

var userSchema = new Schema({
    name: {
      type: String,
      maxlength: 50
    },
    mail: {
      type: String,
      required: true,
      maxlength: 50,
      index: {
        unique: true
      }
    },
    hash: String,
    salt: String,
    {
      collection: "user"
    }
);

userSchema.methods.setPassword = function(password) {
  this.salt = crypto.randomBytes(16).toString('hex');
  this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
};

userSchema.methods.validPassword = function(password) {
  var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
  return this.hash === hash;
};

userSchema.methods.generateJwt = function() {
  var expiry = new Date();
  expiry.setDate(expiry.getDate() + 7);

  return jwt.sign({
    _id: this._id,
    mail: this.mail,
    name: this.name,
    exp: parseInt(expiry.getTime() / 1000),
  }, process.env.JWT_SECRET); // secret code from .env
};

module.exports = mongoose.model('user', userSchema);
Run Code Online (Sandbox Code Playgroud)

在这里,我尝试使用 sequelize:

 var crypto = require('crypto');
    var jwt = require('jsonwebtoken');

    var User = sequelize.define('user', {
      name: Sequelize.STRING,
      mail: Sequelize.STRING,
      hash: Sequelize.STRING,
      salt: Sequelize.STRING


    });

    User.methods.setPassword = function(password) {
      this.salt = crypto.randomBytes(16).toString('hex');
      this.hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
    };

    User.methods.validPassword = function(password) {
      var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
      return this.hash === hash;
    };

    User.methods.generateJwt = function() {
      var expiry = new Date();
      expiry.setDate(expiry.getDate() + 7);

      return jwt.sign({
        _id: this._id,
        mail: this.mail,
        name: this.name,
        exp: parseInt(expiry.getTime() / 1000),
      }, process.env.JWT_SECRET); // DO NOT KEEP YOUR SECRET IN THE CODE!
    };


module.exports = User;
Run Code Online (Sandbox Code Playgroud)

我没有测试,因为我需要开发另一个部分,但我需要知道你有没有考虑过,我觉得它充满了错误

先感谢您

tha*_*.ts 2

我将重点关注使用实例方法定义模型,以及一些特定于 Passportjs 和 mongoose 的逻辑,您可能需要以不同的方式实现。

两种定义模型的方法。

  1. 就像sequelize.define你实现的方式一样,你可以使用User.prototype.yourMethodsince User is a ES6 class来附加实例方法
var User = sequelize.define('user', {
  name: DataTypes.STRING,
  mail: DataTypes.STRING,
  hash: DataTypes.STRING,
  salt: DataTypes.STRING,
/* ... */
});

User.prototype.validPassword = function(password) {
  var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
  return this.hash === hash;
};

/*
If you want an equivalent of User.statics.yourStaticMethod = function() {}
or User.static('yourstaticmethod', function() {})
You can use the following
*/

User.yourStaticMethod = function() {};
Run Code Online (Sandbox Code Playgroud)
  1. 您还可以延长Model
class User extends Model {
  static yourStaticMethod() {} // in mongoose equivalent to User.statics.yourStaticMethod = function() {}
  validPassword(password) {
    var hash = crypto.pbkdf2Sync(password, this.salt, 1000, 64).toString('hex');
    return this.hash === hash;
  }
};

User.init({
  name: DataTypes.STRING,
  mail: DataTypes.STRING,
  hash: DataTypes.STRING,
  salt: DataTypes.STRING,
/* ... */
}, {
  sequelize,
  modelName: 'user'
});


Run Code Online (Sandbox Code Playgroud)