Javascript 续集ES6模型方法不存在

Javascript 续集ES6模型方法不存在,javascript,node.js,express,orm,sequelize.js,Javascript,Node.js,Express,Orm,Sequelize.js,在尝试将Sequelize JS v4与ES6类一起使用时,我在实例方法的执行方面遇到了问题。出于某种原因,尽管它们是在代码中定义的,但它们似乎并不存在 这里有一个例子- 模型文件 'use strict'; const Sequelize = require("sequelize"); class Model extends Sequelize.Model { static init(sequelize, DataTypes) { return super.init(

在尝试将Sequelize JS v4与ES6类一起使用时,我在实例方法的执行方面遇到了问题。出于某种原因,尽管它们是在代码中定义的,但它们似乎并不存在

这里有一个例子-

模型文件

'use strict';
const Sequelize = require("sequelize");

class Model extends Sequelize.Model {

  static init(sequelize, DataTypes) {
    return super.init(
      {
        // properties
      },
      { sequelize }
    );
  }

  static associate(models) {
  }


  async modelMethod() {

  }

}

module.exports = Model;
模型启动

let modelClass = require('../models/' + modelFile);

let model = modelClass.init(sequelize, Sequelize);
然后在控制器文件中将该模型作为控制器的属性调用

async controllerMethod(req, res) {
    let info = await this.model.modelMethod();
    res.send(info);
}
还有我收到的错误-

TypeError:this.model.modelMethod不是位于的函数 Controller.controllerMethod(/usr/app/controllers/Controller.js:83:41)位于 Layer.handle[作为handle\u请求] (/usr/app/node_modules/express/lib/router/layer.js:95:5)在下一个 (/usr/app/node_modules/express/lib/router/route.js:137:13) 路线调度 (/usr/app/node_modules/express/lib/router/route.js:112:3) Layer.handle[作为handle\u请求] (/usr/app/node_modules/express/lib/router/layer.js:95:5) /usr/app/node_modules/express/lib/router/index.js:281:22 at param (/usr/app/node_modules/express/lib/router/index.js:354:14)位于param (/usr/app/node_modules/express/lib/router/index.js:365:14) (/usr/app/node_modules/express/lib/router/index.js:365:14) Function.process_参数 (/usr/app/node_modules/express/lib/router/index.js:410:3)在下一个 (/usr/app/node_modules/express/lib/router/index.js:275:10) sequelize.models.Session.findOne.then(/usr/app/app.js:44:24)位于 tryCatcher(/usr/app/node_modules/bluebird/js/release/util.js:16:23) 承诺。\你从Handler处获得了和解 (/usr/app/node_modules/bluebird/js/release/promise.js:512:31) 承诺 (/usr/app/node_modules/bluebird/js/release/promise.js:569:18) 承诺。_结算承诺0 (/usr/app/node_modules/bluebird/js/release/promise.js:614:10) 承诺 (/usr/app/node_modules/bluebird/js/release/promise.js:693:18) 异步.\u drainQueue (/usr/app/node_modules/bluebird/js/release/async.js:133:16) 异步.\u drainQueues (/usr/app/node_modules/bluebird/js/release/async.js:143:10) Immediate.Async.drainQueues (/usr/app/node_modules/bluebird/js/release/async.js:17:14) args.(匿名函数)[as _onImmediate] (/usr/local/lib/node_modules/pm2/node_modules/event loop inspector/index.js:133:29) 运行回调时(timers.js:810:20)

尝试输出类的方法会得到以下结果-

console.log(Object.getOwnPropertyNames(this.model));


[ 'length',
  'prototype',
  'init',
  'associate',
  'name',
  'sequelize',
  'options',
  'associations',
  'underscored',
  'tableName',
  '_schema',
  '_schemaDelimiter',
  'rawAttributes',
  'primaryKeys',
  '_timestampAttributes',
  '_readOnlyAttributes',
  '_hasReadOnlyAttributes',
  '_isReadOnlyAttribute',
  '_dataTypeChanges',
  '_dataTypeSanitizers',
  '_booleanAttributes',
  '_dateAttributes',
  '_hstoreAttributes',
  '_rangeAttributes',
  '_jsonAttributes',
  '_geometryAttributes',
  '_virtualAttributes',
  '_defaultValues',
  'fieldRawAttributesMap',
  'fieldAttributeMap',
  'uniqueKeys',
  '_hasBooleanAttributes',
  '_isBooleanAttribute',
  '_hasDateAttributes',
  '_isDateAttribute',
  '_hasHstoreAttributes',
  '_isHstoreAttribute',
  '_hasRangeAttributes',
  '_isRangeAttribute',
  '_hasJsonAttributes',
  '_isJsonAttribute',
  '_hasVirtualAttributes',
  '_isVirtualAttribute',
  '_hasGeometryAttributes',
  '_isGeometryAttribute',
  '_hasDefaultValues',
  'attributes',
  'tableAttributes',
  'primaryKeyAttributes',
  'primaryKeyAttribute',
  'primaryKeyField',
  '_hasPrimaryKeys',
  '_isPrimaryKey',
  'autoIncrementAttribute',
  '_scope',
  '_scopeNames' ]

看完曼尼什的评论后,我决定重新尝试一下

显然,实例方法的工作方式是在调用.init方法后初始化模型

所以-


这将允许在没有问题的情况下调用model.modelMethod

静态init函数不是构造函数。它通过设置类的功能来“初始化”类,然后返回类本身

下面是一些示例代码来说明这一点:

类用户扩展Sequelize.Model{
静态初始化(sequelize,数据类型){
返回super.init({
名字:{
类型:DataTypes.STRING
},
姓氏:{
类型:DataTypes.STRING
}
}, {
续集
});
}
全名(){
返回`${this.firstName}${this.lastName}`;
}
}
//你不需要在这里捕捉回报,我只是在展示它是什么。
const result=User.init(sequelize,sequelize);
console.log(结果==用户);//真的
const user=新用户();
console.log(type of user.fullname==“function”);//真的

尝试删除类中的自定义
init
位置,并直接调用父类的
init
方法。另外,要使用该方法,您需要使用诸如
newmodel
Model.build({})
之类的东西初始化该类,这将初始化该模型并使您能够使用该方法。@ManishMDemblani init方法调用super的方法,所以我假设这不是问题所在,至于新模型,我一直在尝试,但没有成功,但现在尝试调用init返回值上的new可能会奏效。我会更新它,如果它工作的原因是因为Sequelize工作在ActiveRecord模式的基础上,它允许您在未初始化时使用相同的模型来查询数据库,并且在获取和初始化后还包含来自数据库的数据实例。我可能需要深入了解它,以便更好地理解它,谢谢@马尼什姆登布拉尼
let model = ModelClass.init(sequelize, Sequelize);
model = new model();