[koa-morgan] Wrapper passes IncomingMessage instead of Koa.Request

The wrapper function passes ctx.req and ctx.res to original morgan.
This commit is contained in:
Vesa Poikajärvi
2017-06-20 16:12:00 +03:00
parent 8aff840533
commit e79b8e5238
2 changed files with 26 additions and 10 deletions

View File

@@ -4,19 +4,20 @@
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 2.1
import { IncomingMessage, ServerResponse } from 'http';
import * as Koa from 'koa';
import * as originalMorgan from 'morgan';
declare namespace morgan {
interface FormatFn {
(tokens: TokenIndexer, req: Koa.Request, res: Koa.Response): string;
(tokens: TokenIndexer, req: IncomingMessage, res: ServerResponse): string;
}
interface TokenCallbackFn {
(req: Koa.Request, res: Koa.Response, arg?: string | number | boolean): string;
(req: IncomingMessage, res: ServerResponse, arg?: string | number | boolean): string;
}
interface TokenIndexer extends originalMorgan.TokenIndexer {}
type TokenIndexer = originalMorgan.TokenIndexer;
/**
* Public interface of morgan logger
@@ -121,7 +122,7 @@ declare namespace morgan {
*/
function compile(format: string): FormatFn;
interface StreamOptions extends originalMorgan.StreamOptions {}
type StreamOptions = originalMorgan.StreamOptions;
/***
* Morgan accepts these properties in the options object.
@@ -141,7 +142,7 @@ declare namespace morgan {
/***
* Function to determine if logging is skipped, defaults to false. This function will be called as skip(req, res).
*/
skip?: (req: Koa.Request, res: Koa.Response) => boolean;
skip?: (req: IncomingMessage, res: ServerResponse) => boolean;
/***
* Output stream for writing log lines, defaults to process.stdout.
@@ -206,6 +207,6 @@ declare function morgan(format: 'tiny', options?: morgan.Options): Koa.Middlewar
* @param format
* @param options
*/
declare function morgan(custom: (req: Koa.Request, res: Koa.Response) => string): Koa.Middleware;
declare function morgan(custom: (req: IncomingMessage, res: ServerResponse) => string): Koa.Middleware;
export = morgan;

View File

@@ -1,3 +1,4 @@
import { IncomingMessage, ServerResponse } from 'http';
import * as Koa from 'koa';
import * as morgan from 'koa-morgan';
@@ -10,6 +11,20 @@ app.use(morgan('short'));
app.use(morgan('tiny'));
app.use(morgan(':remote-addr :method :url'));
const tokenCallback: morgan.TokenCallbackFn = (req: IncomingMessage, res: ServerResponse): string => {
if (req.headers['request-id']) {
if (Array.isArray(req.headers['request-id'])) {
return (req.headers['request-id'] as string[]).join(';');
} else {
return req.headers['request-id'] as string;
}
} else {
return '-';
}
};
morgan.token('id', tokenCallback);
const stream: morgan.StreamOptions = {
write: (str: string) => {
console.log(str);
@@ -19,7 +34,7 @@ const stream: morgan.StreamOptions = {
app.use(morgan('combined', {
buffer: true,
immediate: true,
skip: (req: Koa.Request, res: Koa.Response) => res.status < 400,
skip: (req: IncomingMessage, res: ServerResponse) => res.statusCode < 400,
stream
}));
@@ -41,10 +56,10 @@ interface ExtendedFormatFn extends morgan.FormatFn {
memoizer?: FormatFnIndexer;
}
const developmentExtendedFormatLine: ExtendedFormatFn = (tokens, req: Koa.Request, res: Koa.Response): string => {
const developmentExtendedFormatLine: ExtendedFormatFn = (tokens, req: IncomingMessage, res: ServerResponse): string => {
// get the status code if response written
const status = res.status
? res.status
const status = res.statusCode
? res.statusCode
: undefined;
// get status color