繁体   English   中英

如何在 TypeORM 中使用订阅者?

[英]How to use Subscribers in TypeORM?

考虑使用mongodb进行以下设置(问题可能与数据库无关):

实体/Person.ts

import { Entity, Column } from 'typeorm';

@Entity
export class Person {
  @Column()
  name: string;
}

订阅者/PersonSubscriber.ts

import {
  EntitySubscriberInterface,
  EventSubscriber,
  InsertEvent,
} from 'typeorm';
import { Person } from '../entity/Person';

@EventSubscriber()
export class PersonSubscriber implements EntitySubscriberInterface<Person> {
  listenTo() {
    return Person;
  }

  afterInsert(event: InsertEvent<Person>) {
    console.log(event);
  }
}


配置/mongo.ts

import { MongoConnectionOptions } from 'typeorm/driver/mongodb/MongoConnectionOptions';

export const mongoConfig: MongoConnectionOptions = {
  type: 'mongodb',
  host: 'localhost',
  database: process.env.DB_NAME,
  useNewUrlParser: true,
  useUnifiedTopology: true,
  synchronize: true,
  logging: false,
  entities: ['src/entity/**/*.ts'],
  migrations: ['src/migration/**/*.ts'],
  subscribers: ['src/subscriber/**/*.ts'],
  cli: {
    entitiesDir: 'src/entity',
    migrationsDir: 'src/migration',
    subscribersDir: 'src/subscriber',
  },
};

索引.ts

import { createConnection } from 'typeorm';
import { mongoConfig } from 'config/mongo';

createConnection(mongoConfig)
  .then(connection => {
    console.log('connection established');
  })
  .catch(console.error);

PersonSubscriberconnection.subscribers数组的第一个元素,但是在插入 Person 文档后, InsertEvent不会记录到控制台。

少了什么东西?

PS这是我设法收集的所有文档

总而言之,他们仍然没有讲述完整的故事。

文件名必须是 name.subscribe.ts

配置文件

"subscribers": ["dist/**/**/**/*.subscriber{.ts,.js}"]

为我工作

检查您的通配符:

subscribers: ['src/subscriber/**/*.ts']

可能需要

subscribers: ['src/subscriber/*.ts']

相反,可能带有*.js文件的第二个条目。 至少这就是我的订阅者没有触发的原因 - 递归 globbing 可能依赖于操作系统。 根据您的 shell 和操作系统以及 TypeORM 在内部扩展星号的方式(我不知道),在 bash Z2591C98B70119FE624898B1E42 开始之前运行shopt -s globstar也可能会削减它。

除此之外,您的路径当然也需要匹配src/前缀,所以我假设您的情况下的 subscriber/ subscriber/PersonSubscriber.ts实际上是src/subscriber/PersonSubscriber.ts

另请注意,TypeORM 也有一种相当独特的解析选项的方式,以防您在环境变量、配置文件或 createConnection() 选项中有多个配置定义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM