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 有许多好处:
- 静态类型检查:TypeScript 允许你为变量、参数和返回值定义类型。这有助于在开发过程中捕获与类型相关的错误,而不是在运行时,从而使代码更加健壮和可预测。
- 提高代码可读性:通过类型注解,代码变得更加自解释,这使得开发人员更容易理解代码库并有效地进行协作。对于大型项目而言,类型信息可当作额外的文档。
- 增强的 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.js 到 src/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;
}