import { Injectable, NestInterceptor, ExecutionContext, CallHandler, Logger, } from '@nestjs/common'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; import { Request } from 'express'; import { getMongoRepository } from 'typeorm'; // import { LogMongo } from '../../log/log.mongo'; function createGraphqlLog(request: Request, info, resolve_time: number) { setImmediate(async () => { try { // @ts-ignore const user = request.user; // const new_log = new LogMongo(); // new_log.path_name = info.fieldName; // new_log.parent_type_name = info.parentType.name; // new_log.field_name = info.fieldName; // new_log.type = 'graphql'; // new_log.ip = request.ip; // new_log.resolve_time = resolve_time; // new_log.content_length = request.headers['content-length']; // new_log.user_agent = request.headers['user-agent']; // new_log.sec_fetch_site = String(request.headers['sec-fetch-site']); // new_log.referer = request.headers.referer; // new_log.method = request.method; // if (user) { // new_log.user_id = user.id; // new_log.roles = user.roles; // new_log.permissions = user.permissions; // } // if (request.body.query) { // new_log.query = request.body.query; // } // await getMongoRepository(LogMongo, 'mongo').save(new_log); Logger.debug(`graphql ${info.fieldName} [${resolve_time} ms]`); } catch (e) { Logger.error(`http graphql 中间件错误 ${e.message}`); } }); } function createApiLog(request: Request, resolve_time: number) { setImmediate(async () => { try { // @ts-ignore const user = request.user; // const new_log = new LogMongo(); // new_log.path_name = request.originalUrl; // // new_log.parent_type_name = info.parentType.name; // // new_log.field_name = info.fieldName; // new_log.type = 'api'; // new_log.ip = request.ip; // new_log.resolve_time = resolve_time; // new_log.content_length = request.headers['content-length']; // new_log.user_agent = request.headers['user-agent']; // new_log.sec_fetch_site = String(request.headers['sec-fetch-site']); // new_log.referer = request.headers.referer; // new_log.method = request.method; // if (user) { // new_log.user_id = user.id; // new_log.roles = user.roles; // new_log.permissions = user.permissions; // } // if (request.body) { // new_log.body = JSON.stringify(request.body); // } // if (request.query) { // new_log.query = JSON.stringify(request.query); // } // if (request.params) { // new_log.params = JSON.stringify(request.params); // } // await getMongoRepository(LogMongo, 'mongo').save(new_log); Logger.debug(`api ${request.url} [${resolve_time} ms]`); } catch (e) { Logger.error(`http api 中间件错误 ${e.message}`); } }); } // 拦截所有的请求 并记录所有请求的时间 @Injectable() export class LoggingInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { const start = Date.now(); return next.handle().pipe( tap(() => { const ctx = context.switchToHttp(); const request = ctx.getRequest(); const resolve_time = Date.now() - start; if (!request || request.url.startsWith('/graphql')) { // @ts-ignore const info = context.args[3]; // @ts-ignore const old_request = context.args[2].request; createGraphqlLog(old_request, info, resolve_time); } else if (request) { createApiLog(request, resolve_time); } }), ); } }