Хранилище не найдено при сборке с веб-пакетом - PullRequest
0 голосов
/ 04 ноября 2018

Я сделаю все возможное, чтобы этот вопрос был как можно яснее.

Я работаю с бэкэндом, использующим NodeJS, который взаимодействует с базой данных SQL Server, используя TypeORM. Я настроил систему сборки с помощью webpack4, где я строю сущности TypeORM как модули commonjs (у меня столько точек входа, сколько сущностей в базе данных). У меня есть две отдельные конфигурации веб-пакетов, одна для основного файла, а другая для сущностей TypeORM.

Процесс сборки идет нормально, без предупреждений, без ошибок, но когда я запускаю основной файл, TypeORM выдает мне RepositoryNotFoundError: No repository for "Foo" was found. looks like this entity is not registred in the default connection.

У меня не было этой проблемы при использовании компилятора Typescipt.

Большое спасибо за вашу помощь.

webpack.config.js:

const path = require('path');
const fs = require('fs');
const nodeExternals = require('webpack-node-externals');
const CleanBuildDir = require('clean-webpack-plugin');

function localExternals(context, request, callback) {
  if (/\.\//.test(request)) {
    return callback(null, `commonjs ${request}`);
  }
  return callback();
}

const entitesConfig = {
  target: 'node',
  mode: 'development',
  node: {
    __dirname: false,
    __filename: false,
  },
  entry: () => {
    const files = fs.readdirSync(path.resolve(__dirname, 'src/entities'));
    const entries = {};
    files.forEach(file => {
      entries[file.split('.')[0]] = path.resolve(__dirname, 'src/entities', file);
    });
    return entries;
  },
  output: {
    path: path.resolve(__dirname, 'dist/entities'),
    filename: '[name].js',
    libraryTarget: 'commonjs',
  },
  resolve: {
    extensions: ['.ts', '.js'],
  },
  externals: [nodeExternals(), localExternals],
  module: {
    rules: [
      {
        test: /\.(t|j)s$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      },
    ],
  },
  plugins: [new CleanBuildDir()],
};

const mainConfig = {
  target: 'node',
  mode: 'development',
  node: {
    __dirname: false,
    __filename: false,
  },
  entry: path.resolve(__dirname, 'src/main.ts'),
  output: {
    path: path.resolve(__dirname, 'dist'),
    filename: '[name].js',
  },
  resolve: {
    extensions: ['.ts', '.js'],
  },
  externals: [nodeExternals(), localExternals],
  module: {
    rules: [
      {
        test: /\.(t|j)s$/,
        exclude: /node_modules/,
        loader: 'babel-loader',
      },
    ],
  },
  plugins: [new CleanBuildDir()],
};

module.exports = [entitesConfig, mainConfig];

ormconfig.js:

const path = require('path');
const fs = require('fs');

const entitiesFiles = fs
  .readdirSync(path.resolve(__dirname, 'dist/entities'))
  .map(file => path.resolve(__dirname, 'dist/entities', file));

module.exports = {
  name: 'default',
  type: 'mssql',
  host: '127.0.0.1',
  port: 1433,
  username: '*****',
  password: '*****',
  database: 'Foo',
  schema: 'dbo',
  synchronize: false,
  entities: entitiesFiles,
};

import { createConnection } from 'typeorm';
import { Foo } from './entities/Foo';
import { performance } from 'perf_hooks';

function selection(table: string, columns: string[]): string[] {
  return columns.map(col => `${table}.${col}`);
}

async function job(server: string) {
  const connection = await createConnection();
  const start = performance.now();
  const foos = await connection
    .getRepository(Foo)
    .createQueryBuilder('foo')
    .leftJoinAndSelect('affaire.bar', 'bar')
    .orderBy('affaire.Code_Affaire', 'DESC')
    .getMany();
  console.log(`Done in ${performance.now() - start} ms`);
  console.log(foos);
}

job('ANY').catch(err => console.log(`Error in job : ${err}`));

babel.config.js:

const presets = ['@babel/typescript', ['@babel/env', { useBuiltIns: 'usage', targets: { node: 'current' } }]];
const plugins = [
  ['@babel/proposal-decorators', { decoratorsBeforeExport: true }],
  '@babel/proposal-class-properties',
  '@babel/proposal-object-rest-spread',
];

module.exports = { presets, plugins };

1 Ответ

0 голосов
/ 04 ноября 2018

Мне удалось заставить его работать, изменив параметры @babel/proposal-decorators с decoratorsBeforeExport: true на legacy: true и добавив loose: true к плагину @babel/proposal-class-properties.

new babel.config.js:

const presets = ['@babel/typescript', ['@babel/env', { useBuiltIns: 'usage', targets: { node: 'current' } }]];
const plugins = [
  ['@babel/proposal-decorators', { legacy: true }],
  ['@babel/proposal-class-properties', { loose: true }],
  '@babel/proposal-object-rest-spread',
];

module.exports = { presets, plugins };
...