如何在TypeORM中使用订阅者?

Mat*_*vic 6 mongodb node.js typeorm

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

实体/人物.ts

import { Entity, Column } from 'typeorm';

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

Run Code Online (Sandbox Code Playgroud)

订阅者/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);
  }
}


Run Code Online (Sandbox Code Playgroud)

配置/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',
  },
};

Run Code Online (Sandbox Code Playgroud)

索引.ts

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

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

Run Code Online (Sandbox Code Playgroud)

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

少了什么东西?

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

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

小智 10

文件名必须是 name.subscribe.ts

或配置

"subscribers": ["dist/**/**/**/*.subscriber{.ts,.js}"]
Run Code Online (Sandbox Code Playgroud)

为我工作


phi*_*294 -2

检查您的通配符:

subscribers: ['src/subscriber/**/*.ts']
Run Code Online (Sandbox Code Playgroud)

可能需要

subscribers: ['src/subscriber/*.ts']
Run Code Online (Sandbox Code Playgroud)

相反,可能有第二个*.js文件条目。至少这就是为什么我的订阅者没有解雇的原因 - 递归通配符可能依赖于操作系统。根据您的 shell 和操作系统以及 TypeORM 在内部扩展星号的方式(我不知道),shopt -s globstar在启动节点进程之前在 bash shell 中运行也可能会减少它。

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

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