» Node.js:使用Kafka构建事件驱动微服务 » 2. 生产者:Web服务 » 2.2 Express Web 服务器

Express Web 服务器

创建 package

执行 npm init 命令为你的应用创建 package.json 文件。

npm init

这个命令会提示你输入一些内容,比如你应用的名称和版本。目前,你可以简单地按 RETURN 键接受大多数默认设置,除了入口点 entry point

咱们倾向于使用 app.js 而不是 index.js

其结果大致如下:

package name: (lr_event_driven_node) 
version: (1.0.0) 
description: Example project: building event driven microservices in Node.js.
entry point: (index.js) app.js
test command: 
git repository: https://github.com/Literank/lr_event_driven_node.git
keywords: event-driven,kafka,express
author: literank.com
license: (ISC) MIT
About to write to /Users/netdong/workspace/2023/projects/lr_event_driven_node/package.json:

{
  "name": "lr_event_driven_node",
  "version": "1.0.0",
  "description": "Example project: building event driven microservices in Node.js.",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/Literank/lr_event_driven_node.git"
  },
  "keywords": [
    "event-driven",
    "kafka",
    "express"
  ],
  "author": "literank.com",
  "license": "MIT",
  "bugs": {
    "url": "https://github.com/Literank/lr_event_driven_node/issues"
  },
  "homepage": "https://github.com/Literank/lr_event_driven_node#readme"
}

该命令会创建一个 package.json 文件,其用于查看管理项目依赖。

安装 Express

npm install express

该命令会更新 package.json 文件并在项目中自动创建一个 package-lock.json 文件。

创建模板目录

创建一个名为 templates 的目录,将 index.html 移进去。文件名改为 index.handlebars

调整页面标题:

- <title>LiteRank Book Store</title>
+ <title>{{ title }}</title>
...
- <h1 class="text-4xl font-bold">LiteRank Book Store</h1>
+ <h1 class="text-4xl font-bold">{{ title }}</h1>

{{ title }}Handlebars 模板引擎的语法。 你可以为 Express 选择任意模板引擎。

安装 Handlebars

npm install express-handlebars

express-handlebars 是 Express 的 Handlebars 视图渲染引擎。

调整 package.json

确认你的 package.json"type": "module" 设置以使用 ES 模块机制。

{
  "type": "module",
  "dependencies": {
    "express": "^4.19.2",
    "express-handlebars": "^7.1.2"
  }
}

创建 app.js:

import express from "express";
import { engine } from "express-handlebars";

const app = express();
const port = 3000;

// Set Handlebars as the template engine
app.engine("handlebars", engine());
app.set("view engine", "handlebars");
// Set the directory for template files
app.set("views", "./templates");

// Define a route to render the template
app.get("/", (req, res) => {
  // Render the 'index.handlebars' template, passing data to it
  res.render("index", { layout: false, title: "LiteRank Book Store" });
});

// Start the server
app.listen(port, () => {
  console.log(`Server is running on http://localhost:${port}`);
});

了解更多关于 layout 属性的内容:https://www.npmjs.com/package/express-handlebars#layouts

如下运行程序:

node app.js

将得到如下一行内容:

Server is running on http://localhost:3000

你的 web 服务器已经在 3000 端口跑起来了。

尝试在浏览器中访问 http://localhost:3000/ 。它应该展示一个如之前章节设计的网页给你。

使用 TypeScript

在 Node.js 项目中使用 TypeScript 有许多好处:

  1. 静态类型检查:TypeScript 允许你为变量、参数和返回值定义类型。这有助于在开发过程中捕获与类型相关的错误,而不是在运行时,从而使代码更加健壮和可预测。
  2. 提高代码可读性:通过类型注解,代码变得更加自解释,这使得开发人员更容易理解代码库并有效地进行协作。对于大型项目而言,类型信息可当作额外的文档。
  3. 增强的 IDE 支持:TypeScript 在像 Visual Studio Code 这样的 IDE 中可提供更好的工具支持,比如提供代码导航、自动完成和内联文档等功能,这可以大大提高生产力和代码质量。

好的,让我们来进行转型。

执行如下命令来安装 typescript 相关依赖:

npm install typescript ts-node @types/node @types/express --save-dev

--save-dev 标记表示这些依赖都是开发依赖 devDependencies,只在开发阶段被使用。

在根目录创建 tsconfig.json

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "CommonJS",
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true
  },
  "include": ["src/**/*.ts"],
  "exclude": ["node_modules"]
}

移动 app.jssrc/app.ts

更新 package.json:

@@ -1,11 +1,11 @@
 {
   "name": "lr_event_driven_node",
   "version": "1.0.0",
-  "type": "module",
   "description": "Example project: building event driven microservices in Node.js.",
   "main": "app.js",
   "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "dev": "ts-node src/app.ts",
+    "build": "tsc"
   },
   "repository": {
     "type": "git",
@@ -25,5 +25,11 @@
   "dependencies": {
     "express": "^4.19.2",
     "express-handlebars": "^7.1.2"
+  },
+  "devDependencies": {
+    "@types/express": "^4.17.21",
+    "@types/node": "^20.12.7",
+    "ts-node": "^10.9.2",
+    "typescript": "^5.4.5"
   }
 }

运行新版的程序:

npm run dev

再次在浏览器中访问 http://localhost:3000/

如果网页一切正常,那就表示 TypeScript 版本的 web 服务运行正常。

上页下页