» Node.js:使用Express构建REST API » 2. 开发 » 2.7 配置文件和日志

配置文件和日志

...
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"