You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

36 lines
1.2 KiB

import log4js from "logger";
import { randomUUID } from "crypto";
const logger = log4js.getLogger("APP")
if (import.meta.dev) {
console.log("plugin: 00.req-time");
}
declare module "http" {
interface IncomingMessage {
$beginTime: number;
$requestId: string;
}
}
export default defineNitroPlugin((nitroApp) => {
nitroApp.hooks.hook('request', async (event) => {
const incoming = event.node.req.headers["x-request-id"];
const requestId =
typeof incoming === "string" && incoming.trim().length > 0
? incoming.trim()
: randomUUID();
event.node.req.$requestId = requestId;
event.node.req.$beginTime = new Date().getTime();
event.node.res.setHeader("X-Request-Id", requestId);
logger.info(`[${requestId}]`, `[${event.method}-${event.path}]`, "开始请求");
})
nitroApp.hooks.hook('afterResponse', async (event) => {
const requestId = event.node.req.$requestId ?? "(no-request-id)";
let curTime = new Date().getTime()
let offsetTime = curTime - event.node.req.$beginTime
logger.info(`[${requestId}]`, `[${event.method}-${event.path}]`, "请求结束,花费了", offsetTime, "ms");
})
})