配置文件和日志
...
const c = {
app: {
port: Number(port),
},
db: {
fileName: "test.db",
dsn: "mysql://test_user:test_pass@127.0.0.1:3306/lr_book?charset=utf8mb4",
},
};
...
你可能已经注意到了,硬编码的配置项是潜在的安全漏洞。而且一旦编译部署后,开发人员也很难改动控制它。
所以,你需要一个单独的配置文件。
添加 config.json:
{
"app": {
"port": 8080
},
"db": {
"file_name": "test.db",
"dsn": "mysql://test_user:test_pass@127.0.0.1:3306/lr_book?charset=utf8mb4"
}
}
添加 parseConfig
函数,在 infrastructure/config/config.ts 中:
@@ -1,3 +1,5 @@
+import { readFileSync } from "fs";
+
interface DBConfig {
fileName: string;
dsn: string;
@@ -11,3 +13,7 @@ export interface Config {
app: ApplicationConfig;
db: DBConfig;
}
+
+export function parseConfig(filename: string): Config {
+ return JSON.parse(readFileSync(filename, "utf-8"));
+}
在 infrastructure/config/index.ts 中导出函数:
export { Config, parseConfig } from "./config";
然后在 main.ts 中使用:
@@ -1,20 +1,13 @@
import { WireHelper } from "@/application";
import { InitApp } from "@/adapter/router";
+import { parseConfig } from "@/infrastructure/config";
-const port = process.env.PORT || 3000;
+const config_filename = "config.json";
-const c = {
- app: {
- port: Number(port),
- },
- db: {
- fileName: "test.db",
- dsn: "mysql://test_user:test_pass@127.0.0.1:3306/lr_book?charset=utf8mb4",
- },
-};
+const c = parseConfig(config_filename);
const wireHelper = new WireHelper(c);
const app = InitApp(wireHelper);
-app.listen(port, () => {
- console.log(`Running on port ${port}`);
+app.listen(c.app.port, () => {
+ console.log(`Running on port ${c.app.port}`);
});
硬编码的配置项被移到了 config.json
中。不错!
警醒: 不要直接 git 提交 config.json。可能会导致敏感数据泄露。如果非要提交的话,建议只提交配置格式模板。
比如:{ "app": { "port": 3000 }, "db": { "file_name": "", "dsn": "" } }
Morgan 日志
Morgan 是为 Express.js 提供的一款流行的 HTTP 请求日志中间件。它可以帮助你记录指向 Express 应用的 HTTP 请求。
首先,通过 npm 安装 Morgan:
npm i morgan
另外,你还需要安装 @types/morgan
已获得类型定义信息。
npm install @types/morgan --save-dev
使用 morgan
,在 adapter/router.ts 中:
@@ -1,4 +1,5 @@
import express, { Request, Response } from "express";
+import morgan from "morgan";
import { Book } from "@/domain/model";
import { BookOperator } from "@/application/executor";
@@ -105,6 +106,9 @@ export function InitApp(wireHelper: WireHelper): express.Express {
// Middleware to parse JSON bodies
app.use(express.json());
+ // Use Morgan middleware with predefined 'combined' format
+ app.use(morgan("combined"));
+
// Define a health endpoint handler
app.get("/", (req: Request, res: Response) => {
res.status(200).json({ status: "ok" });
然后你就可以有这样还不错的日志:
::ffff:127.0.0.1 - - [01/Mar/2024:13:13:19 +0000] "GET /books HTTP/1.1" 200 483 "-" "curl/8.1.2"
::ffff:127.0.0.1 - - [01/Mar/2024:13:13:28 +0000] "GET /books/2 HTTP/1.1" 200 242 "-" "curl/8.1.2"
Loading...
> 此处输出代码运行结果