Skip to content

Commit 46a2363

Browse files
authored
fix: support expressRequestIdHeaderName config option (#86)
1 parent 182169f commit 46a2363

File tree

2 files changed

+66
-2
lines changed

2 files changed

+66
-2
lines changed

src/base-middleware.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ import {DEFAULT_REQUEST_ID_HEADER} from './constants';
77
export function setupBaseMiddleware(ctx: AppContext, expressApp: Express) {
88
expressApp.use((req, res, next) => {
99
try {
10-
const requestId = (req.headers[DEFAULT_REQUEST_ID_HEADER] || uuidv4()) as string;
10+
const requestIdHeaderName =
11+
ctx.config.expressRequestIdHeaderName || DEFAULT_REQUEST_ID_HEADER;
12+
const requestId = (req.headers[requestIdHeaderName] as string) || uuidv4();
1113
req.id = requestId;
12-
res.setHeader(DEFAULT_REQUEST_ID_HEADER, requestId);
14+
res.setHeader(requestIdHeaderName, requestId);
1315

1416
req.routeInfo = {};
1517

src/tests/logging.test.ts

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,4 +415,66 @@ describe('log system', () => {
415415

416416
expect(log?.spanId).toBeTruthy();
417417
});
418+
419+
it('should use custom request id header name when expressRequestIdHeaderName is set', async () => {
420+
const customHeaderName = 'x-custom-request-id';
421+
const {app, logger} = setupApp({
422+
config: {
423+
expressRequestIdHeaderName: customHeaderName,
424+
},
425+
});
426+
427+
const agent = request.agent(app.express);
428+
429+
const requestId = Math.random().toString();
430+
431+
const response = await agent.get('/get').set(customHeaderName, requestId);
432+
433+
// Check that response contains custom header
434+
expect(response.headers[customHeaderName]).toBe(requestId);
435+
436+
// last log with response
437+
let log = JSON.parse(logger.write.mock.calls?.pop() || '{}');
438+
439+
// Check response log with custom header
440+
expect(log).toMatchObject({
441+
msg: `[Express GET] Request completed [${requestId}]`,
442+
level: 30,
443+
name: APP_NAME,
444+
time: expect.any(Number),
445+
req: {
446+
id: requestId,
447+
method: 'GET',
448+
url: '/get',
449+
},
450+
res: {
451+
statusCode: '200',
452+
responseTime: expect.any(Number),
453+
headers: {
454+
[customHeaderName]: requestId,
455+
},
456+
},
457+
});
458+
459+
// first log with request
460+
log = JSON.parse(logger.write.mock.calls?.pop() || '{}');
461+
462+
// Check request log contains correct requestId from custom header
463+
expect(log).toMatchObject({
464+
msg: `[Express GET] Request started [${requestId}]`,
465+
level: 30,
466+
name: APP_NAME,
467+
time: expect.any(Number),
468+
req: {
469+
id: requestId,
470+
method: 'GET',
471+
url: '/get',
472+
headers: {
473+
[customHeaderName]: requestId,
474+
},
475+
remoteAddress: expect.any(String),
476+
remotePort: expect.any(Number),
477+
},
478+
});
479+
});
418480
});

0 commit comments

Comments
 (0)