Getting request information like Header in TypeORM Logger

Viewed 375

I'm trying to create a Custom Logger (of TypeORM) that logs every "UPDATE", "CREATE" and "DELETE" made in the database. So far I got it to work but now I wanna add the option to know which user made that request. For these requests you always need to be logged in, so I'm trying to access the header of the request in order to the the JWT Token but queryRunner.data is empty.

So far I have this code:

 public logQuery(query: string, parameters?: any[], queryRunner?: QueryRunner): any {
    const type = query.substring(0, 6);
    if ((type === 'INSERT' || type === 'UPDATE' || type === 'DELETE') && !query.includes('INSERT INTO "log"')) {
      const log = new Log();

      console.log(queryRunner.data);

      const requestUrl = queryRunner && queryRunner.data.request ? `(${queryRunner.data.request.url}) ` : '';
      console.log(`${requestUrl}executing query: `);

      log.query = query;
      log.parameters = parameters?.toString();
      log.type = type;

      getRepository(Log).save(log).then();
    }
  }

As you can see I added the bits of code that TypeORM display in their documentation to show the URL where the request was sent from (I think). But It's always empty...

Not sure if the reason why it's empty is because I'm locally.

If you got any ideas please let me know.

1 Answers

I think I have found what you are looking for. You can use subscribers with typeorm to listen to any insert, update, delete action in the database for every entity.

Here is the documentation link

https://github.com/typeorm/typeorm/blob/master/docs/listeners-and-subscribers.md#what-is-an-entity-listener

Below an example for what I think you were looking for. You need to register this class in the connection options of typeorm. You can do this with subscribers: [EntitySubscribeer]

@EventSubscriber()
export class EntitySubscribeer implements EntitySubscriberInterface {

    /**
     * Called after entity is loaded.
     */
    afterLoad(entity: any) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`AFTER ENTITY LOADED: `, entity);
    }

    /**
     * Called before post insertion.
     */
    beforeInsert(event: InsertEvent<any>) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`BEFORE POST INSERTED: `, event.entity);
    }

    /**
     * Called after entity insertion.
     */
    afterInsert(event: InsertEvent<any>) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`AFTER ENTITY INSERTED: `, event.entity);
    }

    /**
     * Called before entity update.
     */
    beforeUpdate(event: UpdateEvent<any>) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`BEFORE ENTITY UPDATED: `, event.entity);
    }

    /**
     * Called after entity update.
     */
    afterUpdate(event: UpdateEvent<any>) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`AFTER ENTITY UPDATED: `, event.entity);
    }

    /**
     * Called before entity removal.
     */
    beforeRemove(event: RemoveEvent<any>) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`BEFORE ENTITY WITH ID ${event.entityId} REMOVED: `, event.entity);
    }

    /**
     * Called after entity removal.
     */
    afterRemove(event: RemoveEvent<any>) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`AFTER ENTITY WITH ID ${event.entityId} REMOVED: `, event.entity);
    }

    /**
     * Called before transaction start.
     */
    beforeTransactionStart(event: TransactionStartEvent) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`BEFORE TRANSACTION STARTED: `, event);
    }

    /**
     * Called after transaction start.
     */
    afterTransactionStart(event: TransactionStartEvent) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`AFTER TRANSACTION STARTED: `, event);
    }

    /**
     * Called before transaction commit.
     */
    beforeTransactionCommit(event: TransactionCommitEvent) {
        console.log(`BEFORE TRANSACTION COMMITTED: `, event);
    }

    /**
     * Called after transaction commit.
     */
    afterTransactionCommit(event: TransactionCommitEvent) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`AFTER TRANSACTION COMMITTED: `, event);
    }

    /**
     * Called before transaction rollback.
     */
    beforeTransactionRollback(event: TransactionRollbackEvent) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`BEFORE TRANSACTION ROLLBACK: `, event);
    }

    /**
     * Called after transaction rollback.
     */
    afterTransactionRollback(event: TransactionRollbackEvent) {
    console.log(event.entity.name)
    // entity class
    console.log(event.entity)
        console.log(`AFTER TRANSACTION ROLLBACK: `, event);
    }

}
Related