Я пытаюсь использовать объекты типа orm, определенные вне проекта. То есть у меня два проекта: модели и core-api. Models - это пакет npm, который экспортирует определение сущностей. Итак, из core-api (проект nestjs) я пытаюсь определить соединение, используя эти объекты. Что-то вроде этого:
@Module({
imports: [ TypeOrmModule.forRoot({
type: 'postgres',
host: 'postgres',
port: 5432,
username: 'myuser',
password: 'mypass',
database: 'mydb',
entities: [
__dirname + '../node_modules/something/models/src/*.entity.ts'
],
synchronize: true,
}), AModule ],
controllers: [],
providers: [],
})
export class AppModule {}
Затем в модуле A я импортирую объект A из пакета npm:
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AsController } from './As.controller';
import { AsService } from './As.service';
import { A } from 'something/models';
@Module({
imports: [TypeOrmModule.forFeature([ A ])],
controllers: [AController],
providers: [AService],
})
export class AModule {}
Это заканчивается следующей ошибкой:
RepositoryNotFoundError: No repository for "A" was found. Looks like this entity is not registered in current "https://stackoverflow.com/a/54191513/3943197https://stackoverflow.com/a/54191513/3943197default" connection?
Я совершенно не понимаю, как следовать, так как не понимаю, как это работает под капотом. Я видел код typeorm и @ nestjs / typeorm, но не мог понять, как его решить.
Спасибо!
Обновлено:
Я мог бы заставить его работать, добавив класс сущности вместо пути, как сказал @serianox. Кроме того, пакет npm something/models экспортирует автономный модуль вложенности. Этот модуль импортирует / экспортирует объекты, определенные в пакете. Таким образом, я мог внедрить сущности в основное приложение.





Похоже, вы импортируете файлы .ts из node_modules. Я считаю, что после того, как вы создали свой пакет npm, эти объекты теперь являются файлами .js. Вам следует попробовать изменить свое выражение, чтобы оно могло анализировать файлы .js.
Лично я никогда не использую ts-node, так как он приносит такие проблемы, и отладка с ним практически недоступна. Я считаю, что вам всегда следует использовать среду выполнения node и анализировать только файлы .js (кроме того, это ближе к рабочей среде).
Вы можете передавать ссылки на классы в «сущности» вместо пути, Например:
import {Entity1, Entity2} from '@models'
@Module({
imports: [ TypeOrmModule.forRoot({
type: 'postgres',
host: 'postgres',
port: 5432,
username: 'myuser',
password: 'mypass',
database: 'mydb',
entities: [
Entity1, Entity2
],
synchronize: true,
}), AModule ],
controllers: [],
providers: [],
})
export class AppModule {}
как получить доступ к @models?
Думаю, нашел обходной путь для этой проблемы;
мы можем импортировать модули из модуля npm следующим образом
import * as Models from "your-models-package";
затем перебрать их и сохранить в массиве
const models = [];
for (const key in Models) {
if (Models.hasOwnProperty(key)) {
const model = Models[key];
models.push(model);
}
}
окончательное использование в определении модуля
const dbConfig = TypeOrmModule.forRoot({
type: "postgres",
database: config.postgres.db,
host: config.postgres.host,
port: Number(config.postgres.port),
username: config.postgres.user,
password: config.postgres.pass,
entities: models,
synchronize: true,
});
Я надеюсь, что это помогает
ваше здоровье
Да, это одна из вещей, которые мне были нужны. Спасибо!