Sequelize ES6 Model Методы отсутствуют - PullRequest
0 голосов
/ 15 октября 2018

При попытке использовать 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_request] (/usr/app/node_modules/express/lib/router/layer.js:95: 5) в следующем (/usr/app/node_modules/express/lib/router/route.js:137:13) в Route.dispatch (/usr/app/node_modules/express/lib/router/route.js:112: 3) в Layer.handle [как handle_request] (/usr/app/node_modules/express/lib/router/layer.js:95:5) в / usr / app / node_modules / express / lib / router / index.js: 281: 22 в параметре (/usr/app/node_modules/express/lib/router/index.js:354:14) в параметре (/usr/app/node_modules/express/lib/router/index.js:365: 14) в парам(/usr/app/node_modules/express/lib/router/index.js:365:14) в Function.process_params (/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) в Promise._settlePromiseFromHandler (/usr/app/node_modules/bluebird/js/release/promise.js:512:31) в Promise._settlePromise(/usr/app/node_modules/bluebird/js/release/promise.js:569:18) в Promise._settlePromise0 (/usr/app/node_modules/bluebird/js/release/promise.js:614:10) в Promise._settlePromises (/usr/app/node_modules/bluebird/js/release/promise.js:693:18) в Async._drainQueue (/usr/app/node_modules/bluebird/js/release/async.js:133:16)в Async._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) в Immediate.args. (Анонимная функцияion) [as _onImmediate] (/usr/local/lib/node_modules/pm2/node_modules/event-loop-inspector/index.js:133:29) в runCallback (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' ]

1 Ответ

0 голосов
/ 16 октября 2018

После прочтения комментария Маниша я решил попробовать еще раз.

По-видимому, способ работы экземпляров методов заключается в инициализации модели ПОСЛЕ вызова метода .init.

Итак -

let model = ModelClass.init(sequelize, Sequelize);
model = new model();

Это позволит без проблем вызывать model.modelMethod

...