TypeError: конструктор класса Foo не может быть вызван без 'new' - PullRequest
0 голосов
/ 28 апреля 2019

Не дубликат.

Я знаю, что этот вопрос часто задавался здесь, однако обычное решение этой проблемы - добавить

{
  "presets": [
    [
      "@babel/preset-env",
      {
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}

на ваш .babelrc, однако я сделал это и все еще получаю ошибку.

Полная трассировка стека моей ошибки:

C:\...\node_modules\sequelize\lib\sequelize.js:417
      this.importCache[importPath] = defineCall(this, DataTypes);
                                     ^

TypeError: Class constructor User cannot be invoked without 'new'
    at Sequelize.import (C:\...\node_modules\sequelize\lib\sequelize.js:417:38)
    at Object.<anonymous> (../../src/models/index.ts:22:9)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Module._compile (C:\...\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Object.newLoader [as .js] (C:\...\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (../src/index.ts:9:1)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Module._compile (C:\...\node_modules\pirates\lib\index.js:99:24)
    at Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Object.newLoader [as .js] (C:\...\node_modules\pirates\lib\index.js:104:7)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:754:12)
    at Object.<anonymous> (C:\...\node_modules\@babel\node\lib\_babel-node.js:234:23)
    at Module._compile (internal/modules/cjs/loader.js:701:30)

Мои зависимости:

"devDependencies": {
    "@babel/core": "^7.4.3",
    "@babel/node": "^7.2.2",
    "@babel/preset-env": "^7.4.3",
    "@babel/register": "^7.4.0",
    "@types/bcrypt": "^3.0.0",
    "@types/bluebird": "^3.5.26",
    "@types/cors": "^2.8.5",
    "@types/dotenv": "^6.1.1",
    "@types/express": "^4.16.1",
    "@types/graphql": "^14.2.0",
    "@types/graphql-resolvers": "^0.2.0",
    "@types/ioredis": "^4.0.10",
    "@types/jsonwebtoken": "^8.3.2",
    "@types/node": "^11.13.7",
    "@types/nodemailer": "^4.6.7",
    "@types/pg": "^7.4.14",
    "@types/validator": "^10.11.0",
    "nodemon": "^1.18.11",
    "typescript": "^3.4.5"
  },
  "dependencies": {
    "apollo-server": "^2.4.8",
    "apollo-server-express": "^2.4.8",
    "bcrypt": "^3.0.6",
    "cors": "^2.8.5",
    "dotenv": "^7.0.0",
    "express": "^4.16.4",
    "graphql": "^14.2.1",
    "graphql-redis-subscriptions": "^2.1.0",
    "graphql-resolvers": "^0.3.2",
    "ioredis": "^4.9.0",
    "jsonwebtoken": "^8.5.1",
    "nodemailer": "^6.1.0",
    "pg": "^7.9.0",
    "sequelize": "^5.5.0"
  }

Использование Node версии 10.15.3 (Это текущая версия LTS. Я не могу перейти на текущую версию 12, поскольку она нарушает пакет bcrypt).

Моя конфигурация машинописного текста:

{
  "compilerOptions": {
    "allowJs": true,
    "allowSyntheticDefaultImports": true,
    "jsx": "preserve",
    "lib": ["dom", "es2017"],
    "module": "esnext",
    "moduleResolution": "node",
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "preserveConstEnums": true,
    "skipLibCheck": true,
    "sourceMap": true,
    "strict": true,
    "target": "esnext",
    "outDir": "out"
  }
}

Вот строка кода, вызывающая проблему:

const models: IF_Models = {
  User: sequelize.import("./user"),
  Team: sequelize.import("./team")
};
export default models;

И ./user импортируется:

class User extends Model {
  public test!: string;
  public userId!: number;
  public orgId!: number;
  public role!: string;
  public name!: string;
  public email!: string;
  public password!: string | null;
  public readonly createdAt!: Date;
  public readonly updatedAt!: Date;
  public static async findByLogin(email: string): Promise<User | null> {
    return this.findOne({ where: { email } });
  }
  public generatePasswordHash!: () => Promise<string>;
  public validatePassword!: (password: string) => Promise<boolean>;
}

User.init( ... )

User.prototype.generatePasswordHash( ... )

User.prototype.validatePassword( ... )

export default User

. / Team похожий формат.

Если я перехожу на "module": "commonjs" и запускаю приложение без babel, я получаю ту же ошибку.

Изначально меня убеждали, что это ошибка вавилона, но я думаю, что это должно быть ошибкой в ​​методе импорта sequelize, поскольку ошибка все еще возникает даже без использования babel.

Есть предложения, что еще можно попробовать?

...