» Node.js:使用ElasticSearch构建全文检索API » 2. 索引文档 » 2.1 Express Sever

Express Server

创建项目目录:lr_fulltext_search_node

创建 package

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

npm init

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

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

其结果大致如下:

package name: (lr_fulltext_search_node) 
version: (1.0.0) 
description: Example project: building full-text search API in Node.js.
entry point: (index.js) main.js
test command: 
git repository: 
keywords: literank,full-text,search
author: literank.com
license: (ISC) MIT

{
  "name": "lr_fulltext_search_node",
  "version": "1.0.0",
  "description": "Example project: building full-text search API in Node.js.",
  "main": "main.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "literank",
    "full-text",
    "search"
  ],
  "author": "literank.com",
  "license": "MIT"
}

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

安装 Express

npm install express

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

创建 main.js:

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

app.get("/", (req, res) => {
  res.json({ status: "ok" });
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

如下运行程序:

node main.js

将得到类似如下信息:

Server is running on port 3000

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

尝试使用 curl 命令测试 http://localhost:3000/ URL。它应该展示如下 json:

{
  "status": "ok"
}

使用 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"]
}

移动 main.jssrc/main.ts,并添加类型信息。

import express, { Request, Response } from "express";

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

app.get("/", (req: Request, res: Response) => {
  res.json({ status: "ok" });
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

更新 package.json:

@@ -4,7 +4,8 @@
   "description": "Example project: building full-text search API in Node.js.",
   "main": "main.js",
   "scripts": {
-    "test": "echo \"Error: no test specified\" && exit 1"
+    "dev": "ts-node src/main.ts",
+    "build": "tsc"
   },
   "keywords": [
     "literank",
@@ -15,5 +16,11 @@
   "license": "MIT",
   "dependencies": {
     "express": "^4.19.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 版本的 server 运行正常。

数据模型:Book

数据模型表示 API 处理的数据的结构。

创建 src/domain/model/book.ts:

形如 domain/model/... 目录结构的项目都是在使用4层架构,详情可阅读这里

export interface Book {
  title: string;
  author: string;
  published_at: string;
  content: string;
}