Javascript 续集ES6模型方法不存在
在尝试将Sequelize JS v4与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(
'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();