multi-lane-manager
Version:
Nacos 泳道管理与请求路由组件
49 lines (40 loc) • 1.74 kB
text/typescript
import { createServerMiddleware } from './server-utils';
import type { H3Event } from 'h3';
/**
* 泳道管理服务器中间件
*
* 这个中间件负责处理跨泳道请求的路由和转发。
* 当请求包含目标泳道头信息且目标泳道与当前泳道不同时,
* 中间件会查询 Nacos 获取目标泳道的健康实例,并将请求转发到目标实例。
*
* 中间件通过 createServerMiddleware 函数创建,该函数定义在 server-utils.ts 中。
*/
// 创建中间件处理函数
const middleware = createServerMiddleware();
// 导出中间件处理函数
export default async (event: H3Event) => {
// 检查请求是否已经被处理过,避免重复处理
if (event.context._laneManagerHandled) {
return;
}
// 记录中间件被调用
console.log(`[multi-lane-manager:server-middleware] 中间件被调用,路径: ${event.path}`);
// 特别记录 API 请求
if (event.path.startsWith('/api/')) {
console.log(`[multi-lane-manager:server-middleware] 处理 API 请求: ${event.path}, 方法: ${event.node.req.method}`);
}
try {
// 调用实际的中间件处理函数
return await middleware(event);
} catch (error) {
console.error(`[multi-lane-manager:server-middleware] 处理请求时出错: ${error instanceof Error ? error.message : String(error)}`);
// 如果响应头尚未发送,返回错误响应
if (!event.node.res.headersSent) {
event.node.res.statusCode = 500;
event.node.res.setHeader('Content-Type', 'text/plain');
event.node.res.end(`处理请求时出错: ${error instanceof Error ? error.message : '未知错误'}`);
}
// 标记请求已处理
event.context._laneManagerHandled = true;
}
};