как создать собственный транспортер Winston с помощью typeorm - PullRequest
0 голосов
/ 18 июня 2020

Я использую Winston для регистрации всех типов ошибок / предупреждений et c, которые происходят на моем сервере, и я хочу, чтобы все эти ошибки сохранялись в базе данных. Я использую typeorm для подключения к моему PostgreSQL. Поэтому я попытался создать собственный транспортер, который поможет мне хранить эти журналы в базе данных следующим образом:

TypeORMWinstonTransporter.ts

import Transport = require('winston-transport');
import {LogRepository} from '../repositories/log/logRepository';
import {getCustomRepository} from 'typeorm';

export class TypeORMWinstonTransporter extends Transport {
  private repository: LogRepository;

  constructor(opts?: Transport.TransportStreamOptions) {
    super(opts);

    this.repository = getCustomRepository(LogRepository);
  }

  log(info: any, callback = () => {
  }) {
    setImmediate(() => this.emit('logged', info));

    //I THINK PROBLEM IS HERE HOW I HANDLE PROMISE

    this.repository.saveLog({
      message: info.message,
      level: info.level
    }).then(() => {
      callback();
    }).catch(e => {
      console.error(`TypeORMWinstonTransporter failed to connect to db!
     \nError: ${e}`);

      callback();
    });
  }
}

logRepository.ts

import {EntityRepository, Repository} from 'typeorm';
import {Log} from '../../entities/Log';

export interface LogInput {
  message: string;
  level: string;
}

@EntityRepository(Log)
export class LogRepository extends Repository<Log> {
  async saveLog(input: LogInput): Promise<Log> {
    return this.save(this.create(input));
  }
}

Log.ts

import {Column, CreateDateColumn, Entity, PrimaryGeneratedColumn} from 'typeorm';

@Entity('logs')
export class Log {
  @PrimaryGeneratedColumn()
  id: number;

  @Column({type: 'varchar', nullable: false})
  message: string;

  @Column({type: 'varchar', length: 10, nullable: false})
  level: string;

  @CreateDateColumn()
  createdAt: Date;
}

TypeORMWinstonTransporter.test.ts

import * as winston from 'winston';
import {TypeORMWinstonTransporter} from './TypeORMWinstonTransporter';
import {connectDb} from '../utils/test/testConnection.th';

connectDb();

describe('TypeORMWinstonTransporter', () => {
  let logger: winston.Logger;

  beforeEach(() => {
    logger = winston.createLogger({
      level: 'info',
      format: winston.format.json(),
      transports: [
        new TypeORMWinstonTransporter()
      ]
    });
  });

  it('should log message using transaporter', () => {
    //THIS SAVES NOTHING IN DATABASE
    logger.error('This should be recorded in database');
  });
});

Что я делаю не так. Любая помощь будет принята с благодарностью

...