Я использую 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');
});
});
Что я делаю не так. Любая помощь будет принята с благодарностью