【问题标题】:defining statics function (like in mongoose) in mySql using sequelize使用 sequelize 在 mySql 中定义静态函数(如在 mongoose 中)
【发布时间】:2017-09-13 01:32:34
【问题描述】:

尝试在模型中定义一个函数,以便我可以拥有一组通用的函数。这是我的表格代码。我正在使用 sequelize ORM 和 nodejs

"use strict";

module.exports = function(sequelize, DataTypes) {
  var AttendantUser = sequelize.define('AttendantUser', {
    user_id : {
      type : DataTypes.CHAR(36),
      defaultValue : DataTypes.UUIDV4,
      primaryKey : true
    },
    mobile : {
        type : DataTypes.BIGINT,
        allowNull : false,
        unique : true
    },
    reset_code : {
      type : DataTypes.INTEGER,
      allowNull : true,
      defaultValue : '0000'
    }
  },{
    freezeTableName : true,
    paranoid : true
  });


AttendantUser.usernameInUse = function (callback) {
 console.log("fefe");
 callback(null, "hello");
 }
  return AttendantUser;
};

我尝试使用 usernameInUse 函数时遇到的错误是 . 错误:mModels.usernameInUse 不是函数

【问题讨论】:

标签: mysql node.js mongodb sequelize.js


【解决方案1】:

这就是 classMethods 的用途。在Sequelize documentation page 中查找选项“[options.classMethods]”。

您的代码必须是这样的:

"use strict";

module.exports = function(sequelize, DataTypes) {
  var AttendantUser = sequelize.define('AttendantUser', {
    user_id : {
      type : DataTypes.CHAR(36),
      defaultValue : DataTypes.UUIDV4,
      primaryKey : true
    },
    mobile : {
        type : DataTypes.BIGINT,
        allowNull : false,
        unique : true
    },
    reset_code : {
      type : DataTypes.INTEGER,
      allowNull : true,
      defaultValue : '0000'
    }
  },{
    freezeTableName : true,
    paranoid : true,
    classMethods : {
       usernameInUse = function (callback) {
            console.log("fefe");
            callback(null, "hello");
            return this;
       }
    }
  });

与数据库同步后,即可导入模型

AttendantUser = require('/path/to/attendant-user');

然后你可以像这样调用静态方法:

AttendantUser.usernameInUse(() => {console.log('callback called.');})

【讨论】:

    【解决方案2】:

    Sequelize V4。它看起来与 V3 不同。

    classMethodsinstanceMethods 选项已从 sequelize.define 中删除。 Sequelize 模型现在是 ES6 类。您可以像这样设置类/实例级别的方法:

    const Model = sequelize.define('Model', {
        ...
    }, {
        classMethods: {
            associate: function (model) {...}
        },
        instanceMethods: {
            someMethod: function () { ...}
        }
    });
    

    const Model = sequelize.define('Model', {
        ...
    });
    
    // Class Method
    Model.associate = function (models) {
        ...associate the models
    };
    
    // Instance Method
    Model.prototype.someMethod = function () {..}
    

    【讨论】:

    • 这个问题应该被标记为答案......另一个太老了,我遇到了很多麻烦......你能结束一个链接到讨论这个问题的文档吗?因为我没找到:c
    • @nishi 已更新
    猜你喜欢
    • 1970-01-01
    • 2018-01-18
    • 2015-09-05
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 2019-02-09
    相关资源
    最近更新 更多