From 5b1a1e25ef108c5280fedc041123886e903e71cb Mon Sep 17 00:00:00 2001 From: zhaoyingbo Date: Sat, 16 Nov 2024 12:53:45 +0000 Subject: [PATCH] =?UTF-8?q?feat(base):=20=E6=94=AF=E6=8C=81genContext?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env | 2 ++ .env.prod | 1 + .vscode/settings.json | 2 +- bun.lockb | Bin 109050 -> 131450 bytes bunfig.toml | 5 ++++- index.ts | 23 ++++++++++++++----- package.json | 15 +++++++++---- utils/genContext.ts | 51 ++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 88 insertions(+), 11 deletions(-) create mode 100644 .env.prod create mode 100644 utils/genContext.ts diff --git a/.env b/.env index 14f5aab..85b3b8d 100644 --- a/.env +++ b/.env @@ -4,4 +4,6 @@ # Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB. # See the documentation for all the connection string options: https://pris.ly/d/connection-strings +NODE_ENV=dev + DATABASE_URL="mysql://root:rootpassword@localhost:3306/testdb" \ No newline at end of file diff --git a/.env.prod b/.env.prod new file mode 100644 index 0000000..995fca4 --- /dev/null +++ b/.env.prod @@ -0,0 +1 @@ +NODE_ENV=production \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 04bbd13..c63497e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ { - "cSpell.words": ["bunx", "oxlint"] + "cSpell.words": ["bunx", "commitlint", "dotenvx", "oxlint"] } diff --git a/bun.lockb b/bun.lockb index 0e2dd0eda2b335e096657c9ef51aa600453c634a..08d5c0e8bf49558cc732acd919c592c91943893c 100755 GIT binary patch delta 32847 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 F{~v~UwpsuH delta 19893 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 diff --git a/bunfig.toml b/bunfig.toml index 76ef786..5ce510c 100644 --- a/bunfig.toml +++ b/bunfig.toml @@ -1,2 +1,5 @@ [install] -registry = "https://registry.npmjs.org" \ No newline at end of file +registry = "https://registry.npmjs.org" + +[install.scopes] +"@egg" = "https://git.yingbo.im:333/api/packages/zhaoyingbo/npm/" \ No newline at end of file diff --git a/index.ts b/index.ts index 0fea807..e900d7d 100644 --- a/index.ts +++ b/index.ts @@ -1,14 +1,27 @@ import { initSchedule } from "./schedule" +import genContext from "./utils/genContext" initSchedule() Bun.serve({ async fetch(req) { - const url = new URL(req.url) - // 根路由 - if (url.pathname === "/") return new Response("hello, glade to see you!") - if (url.pathname === "/ci") return new Response("OK") - return new Response("OK") + const ctx = await genContext(req) + const { path, genResp, logger } = ctx + if (path.exact("/")) { + logger.info(`${req.method} ${req.url}`) + logger.debug(`req body: ${ctx.text}`) + } + // 逻辑处理 + try { + // 健康检查 + if (path.full("/health")) return genResp.healthCheck() + // 其他 + return genResp.healthCheck("hello, there is egg, glade to serve you!") + } catch (error: any) { + // 错误处理 + logger.error(error.message) + return genResp.serverError(error.message || "server error") + } }, port: 3000, }) diff --git a/package.json b/package.json index af7995a..9681fc1 100644 --- a/package.json +++ b/package.json @@ -3,8 +3,8 @@ "module": "index.ts", "type": "module", "scripts": { - "start": "NODE_ENV=production bun run index.ts", - "dev": "NODE_ENV=dev bun run index.ts --watch", + "start": "dotenvx run -f .env.prod -- bun run index.ts", + "dev": "dotenvx run -f .env -- bun run index.ts --watch", "lint": "oxlint --fix .", "prepare": "husky", "prettier": "prettier --write .", @@ -22,6 +22,7 @@ "@commitlint/config-conventional": "^19.5.0", "@types/lodash": "^4.14.202", "@types/node-schedule": "^2.1.6", + "@types/uuid": "^10.0.0", "@typescript-eslint/eslint-plugin": "^7.8.0", "@typescript-eslint/parser": "^7.8.0", "bun-types": "latest", @@ -36,9 +37,15 @@ "typescript": "^5.0.0" }, "dependencies": { + "@dotenvx/dotenvx": "^1.24.0", + "@egg/hooks": "^1.2.0", + "@egg/logger": "^1.4.4", + "@egg/net-tool": "^1.9.2", + "@egg/path-tool": "^1.4.1", "@prisma/client": "^5.22.0", "lodash": "^4.17.21", "node-schedule": "^2.1.1", - "pocketbase": "^0.21.1" + "pocketbase": "^0.21.1", + "uuid": "^11.0.3" } -} +} \ No newline at end of file diff --git a/utils/genContext.ts b/utils/genContext.ts new file mode 100644 index 0000000..4301670 --- /dev/null +++ b/utils/genContext.ts @@ -0,0 +1,51 @@ +import loggerIns from "@egg/logger" +import { NetTool } from "@egg/net-tool" +import { PathCheckTool } from "@egg/path-tool" +import { v4 as uuid } from "uuid" +import { Logger } from "winston" + +export interface Context { + req: Request + requestId: string + logger: Logger + genResp: NetTool + body: any + text: string + path: PathCheckTool + searchParams: URLSearchParams +} + +/** + * 生成请求上下文。 + * + * @param {Request} req - 请求对象。 + * @returns {Promise} 返回包含请求上下文的对象。 + */ +const genContext = async (req: Request) => { + let body: any = null + let text: string = "" + try { + text = await req.text() + body = JSON.parse(text) + } catch { + /* empty */ + } + const searchParams = new URL(req.url).searchParams + const requestId = uuid() + const logger = loggerIns.child({ requestId }) + const genResp = new NetTool({ requestId }) + const path = new PathCheckTool(req.url) + + return { + req, + path, + requestId, + logger, + genResp, + body, + text, + searchParams, + } as Context +} + +export default genContext