feat: 添加请求日志中间件以记录请求信息

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
2026-04-24 22:41:18 +08:00
parent 81965595f0
commit aa53691dc7
2 changed files with 33 additions and 3 deletions
+7 -3
View File
@@ -1,4 +1,5 @@
// server/api/auth/login.post.ts // server/api/auth/login.post.ts
import { consola } from "consola";
import type { IUserLoginData, IUserLoginRequest } from "#shared/types"; import type { IUserLoginData, IUserLoginRequest } from "#shared/types";
import { import {
clearNewApiAuthCookies, clearNewApiAuthCookies,
@@ -78,10 +79,10 @@ export default defineEventHandler(async (event) => {
if (!session) { if (!session) {
// 没有 session 就不能恢复 NewAPI 登录态,必须让前端明确感知失败。 // 没有 session 就不能恢复 NewAPI 登录态,必须让前端明确感知失败。
clearNewApiAuthCookies(event); clearNewApiAuthCookies(event);
return createErrorResponse( consola.error(
500, "/api/auth/login 登录成功但未收到 NewAPI session,请稍后重试"
"登录成功但未收到 NewAPI session,请稍后重试"
); );
return createErrorResponse(500, "服务器错误,请稍后重试");
} }
setNewApiAuthCookies( setNewApiAuthCookies(
@@ -97,6 +98,7 @@ export default defineEventHandler(async (event) => {
); );
} catch (error) { } catch (error) {
clearNewApiAuthCookies(event); clearNewApiAuthCookies(event);
consola.error("/api/auth/login 登录失败", error);
return createUpstreamErrorResponse(error, "登录失败"); return createUpstreamErrorResponse(error, "登录失败");
} }
}); });
@@ -113,6 +115,7 @@ const normalizeLoginResponse = (
} }
if (!isRecord(response)) { if (!isRecord(response)) {
consola.error("/api/auth/login 登录失败:响应不是对象");
return { return {
message: "登录失败", message: "登录失败",
user: null user: null
@@ -124,6 +127,7 @@ const normalizeLoginResponse = (
wrapped.message || (wrapped.success ? "登录成功" : "登录失败"); wrapped.message || (wrapped.success ? "登录成功" : "登录失败");
if (wrapped.success !== true || !isUser(wrapped.data)) { if (wrapped.success !== true || !isUser(wrapped.data)) {
consola.error("/api/auth/login 登录失败:上游返回的数据格式不正确");
return { return {
message, message,
user: null user: null
+26
View File
@@ -0,0 +1,26 @@
import { consola } from "consola";
/**
* 请求日志中间件:记录每次请求的 method、路径、状态码和耗时。
* 不记录请求体和响应体,避免密码、token 等敏感信息泄漏。
*/
export default defineEventHandler((event) => {
const start = Date.now();
const method = event.node.req.method ?? "UNKNOWN";
const path = getRequestURL(event).pathname;
// 响应发送完毕后记录结果
event.node.res.on("finish", () => {
const status = event.node.res.statusCode;
const elapsed = Date.now() - start;
const log = `[${method}] ${path}${status} (${elapsed}ms)`;
if (status >= 500) {
consola.error(log);
} else if (status >= 400) {
consola.warn(log);
} else {
consola.info(log);
}
});
});