随着前端技术的不断发展,Node.js 作为后端开发的一个重要选择,在开发 RESTful API 的过程中,也成为了不可或缺的角色。而 TypeScript 这个静态类型语言,可以极大地提高开发效率和代码可维护性。本文将介绍一个实际案例,带大家一步步学习在 TypeScript 下使用 Node.js 开发 RESTful API。
实际案例背景
我们假设有一个简单的需求,需要开发一个博客系统后端,实现以下功能:
- 用户注册、登录、注销;
- 博客的增删改查;
- 文件的上传和下载。
开发环境搭建
首先,我们需要搭建开发环境,安装以下工具:
- Node.js:可以到官网下载和安装;
- TypeScript:可以通过 npm 安装;
- MongoDB:可以到官网下载和安装;
- Postman:测试 RESTful API 的工具,可以到官网下载。
接下来,我们创建一个空的 Node.js 项目。使用以下命令初始化项目:
mkdir blog-api cd blog-api npm init -y // 初始化 package.json
然后,我们安装以下依赖:
npm install express body-parser mongoose multer jsonwebtoken bcryptjs cors npm install -D typescript @types/node @types/express @types/body-parser @types/mongoose @types/multer @types/jsonwebtoken @types/cors nodemon ts-node
上面的依赖中,express
和 body-parser
是用于创建和解析 HTTP 请求的,mongoose
是用于操作 MongoDB 的,multer
是用于处理文件上传的,jsonwebtoken
和 bcryptjs
是处理用户认证和密码加密的,cors
是处理跨域访问的。typescript
是 TypeScript 的运行环境,@types/*
是用于添加 TypeScript 安装的第三方库类型定义文件(声明文件)。
代码实现
接下来,我们来实现上述功能。为了提高可维护性和可读性,我们将代码分成多个文件来实现。
配置
首先,我们新建一个 config.ts
文件,用于配置应用的一些变量和选项:
export const PORT = 4000 export const SECRET_KEY = 'blog_api_secret_key' export const MONGODB_URI = 'mongodb://localhost:27017/blog' export const UPLOADS_DIR = './uploads' export const CORS_ORIGIN = '*' // TODO: 更安全的设置
上述配置中,PORT
是应用监听的端口,SECRET_KEY
是 JWT 生成 token 和验证 token 的密钥,MONGODB_URI
是 MongoDB 的连接地址,UPLOADS_DIR
是上传文件保存的目录,CORS_ORIGIN
是 CORS 的跨域访问源。
数据模型
接下来,我们定义数据模型,使用 Mongoose 来操作 MongoDB。新建 model.ts
文件:
-- -------------------- ---- ------- ------ -------- ---- ---------- ------ --------- ------- ------- ----------------- - ------ ------ --------- ------ - ------ ----- ---------- - --- ---------------- - ------ - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- -- -- - ----------- ---- - - ------ ----- ---- - ------------------------------- ----------- ------ --------- ------- ------- ----------------- - ------ ------ -------- ------ - ------ ----- ---------- - --- ---------------- - ------ - ----- ------- --------- ---- -- -------- - ----- ------- --------- ---- -- -- - ----------- ---- - - ------ ----- ---- - ------------------------------- ----------- ------ --------- ------- ------- ----------------- - --------- ------ --------- ------ - ------ ----- ---------- - --- ---------------- - --------- - ----- ------- --------- ---- -- --------- - ----- ------- --------- ---- -- -- - ----------- ---- - - ------ ----- ---- - ------------------------------- -----------
上述代码中,我们定义了三个数据模型:User
、Blog
和 File
。每个模型都有一个对应的 Schema
,用于约束数据的字段和类型。我们使用 mongoose 的 model()
方法来创建 Mongoose 模型,并导出给其他文件使用。
路由
接下来,我们定义路由,使用 Express 框架来实现。新建 routes.ts
文件:
-- -------------------- ---- ------- ------ ------- ---- --------- ------ ------ ---- ---------- ------ --- ---- -------------- ------ - ---- - ---- --------- ------ - ----------- ----------- - ---- ---------- ------ - -------------- - ---- -------------- ------ - ------- - ---- ---------------- ------ - ---- - ---- --------- ----- ------ - ---------------- -- -- ---------------------------- ----- ----- ---- -- - ----- - ------ -------- - - -------- ----- ---- - ----- -------------- ----- -- -- ------ - ------ ---------------------- -------- -------- -- - ----- -------------- - ----- --------------------- --- ----- ------- - ----- ------------- ------ --------- -------------- -- ------ ---------------------- --- ----------- ------ ------------- -- -- -- -- ------------------------- ----- ----- ---- -- - ----- - ------ -------- - - -------- ----- ---- - ----- -------------- ----- -- -- ------- - ------ ---------------------- -------- --------- -- - ----- --------------- - ----- ------------------------ -------------- -- ------------------ - ------ ---------------------- -------- --------- -- - ----- ----- - ---------- --- ------- -- ----------- ------ ---------- ----- -- -- -- -- -------------------------- ----- ----- ---- -- - -- ----- ---- ------ ------------ -- -- ------ ------------------------ ----- ----- ---- -- - ----- ----- - ----- ------------------ ---------- ------ -- ------ --------------- -- -- ------ ---------------------------- ----- ----- ---- -- - ----- ---- - ----- ---------------------------- -- ------- - ------ ---------------------- -------- ------- -- - ------ -------------- -- -- ---- ------------------------- --------------- ----- ----- ---- -- - ----- - ------ ------- - - -------- ----- ---- - ----- ------------- ------ ------- -- ------ -------------------------- -- -- ---- ---------------------------- --------------- ----- ----- ---- -- - ----- - ------ ------- - - -------- ----- ---- - ----- ----------------------- -------------- - ------ ------- -- - ---- ---- - - -- ------- - ------ ---------------------- -------- ------- -- - ------ -------------- -- -- ---- ------------------------------- --------------- ----- ----- ---- -- - ----- ---- - ----- ------------------------------------- -- ------- - ------ ---------------------- -------- ------- -- - ------ -------------- -- -- ---- ------------ ------------- --------------- ----------------------- ----- ----- ---- -- - ----- ---- - ----- ------------- --------- ------------------ --------- ------------------ -- ------ -------------------------- - - -- ---- ---------------------------------- --------------- ----- ----- ---- -- - ----- ---- - ----- -------------- --------- ------------------- -- -- ------- - ------ ---------------------- -------- ------- -- - ------ ----------------------------------------------- -- ------ ----- ------ - ------
上述代码中,我们定义了如下路由:
/api/register
:实现用户注册,如果邮箱已被注册,则返回409
,否则创建新用户并返回201
;/api/login
:实现用户登录,如果邮箱或密码错误,则返回401
,否则生成 JWT token 并返回;/api/logout
:TODO 实现用户注销;/api/blogs
:实现获取所有博客、创建新博客等功能;/api/blogs/:id
:实现获取单个博客、更新博客和删除博客等功能;/api/files
:实现文件上传,使用multer
中间件处理,上传的文件保存在本地磁盘,并保存文件信息到数据库中;/api/files/:filename
:实现文件下载,根据文件名从数据库中查找文件信息,将文件下载到客户端。
其中,authMiddleware
是一个自定义的中间件,用于验证 JWT token 是否有效。如果 token 验证失败,则返回 401
。
中间件
接下来,我们定义一些中间件函数,用于处理请求和错误。新建 middleware.ts
文件:
-- -------------------- ---- ------- ------ ------- ---- --------- ------ --- ---- -------------- ------ - ---- - ---- --------- ------ - ---------- - ---- ---------- ------ ----- ----------------------- --------------------------- - - ------ ---- ---- ---- - -- - -------------------- ------ ---------------------- -------- --------- -- - ------ ----- ------------------- ---------------------- - ----- ---- ----- -- - ------ ---------------------- -------- ------- -- - ------ ----- --------------- ---------------------- - ----- ----- ---- ----- -- - ----- ------ - ------------------------- -- --------- - ------ ---------------------- -------- -------- -- - ----- ------ ------ - -------------- -- -- ----- --- -------- -- ------- - ------ ---------------------- -------- --------- -- - --- - ----- ------- - ----------------- ----------- -- - --- ------ - ----- ---- - ----- ------------------------- -- ------- - ------ ---------------------- -------- --------- -- - --------------- - ---- -- - ---- ----------- ------ ------ - ----- ------- - ------ ---------------------- -------- --------- -- - -
上述代码中,我们定义了如下中间件:
errorHandlerMiddleware
:处理服务器内部错误,如果出错,则返回500
;notFoundMiddleware
:处理资源不存在错误,如果路由不匹配,则返回404
;authMiddleware
:处理 JWT 认证,验证请求头中的 token 是否有效,如果认证失败,则返回401
。
文件上传
接下来,我们实现文件上传逻辑,创建 utils/multer.ts
文件:
-- -------------------- ---- ------- ------ ---- ---- ------ ------ ------- - ------------------ - ---- -------- ------ - ----------- - ---- ----------- ------ ----- ------- - -------------------- ------------ -------- ----- ----- --- - -------- ------------ -- --------- -------- ----- ----- --- - -------- ---------------------------------------------------- -- -- ------ ----- ---------- - - ---- ---------------- ----- -------------------- --- ------------------ - -- - ----- --------------- - ---------------------------------- -- ----------------- - ------ -------- ----- - ------ ------ ------------------- -
上述代码中,我们使用 multer
模块创建了一个 storage
对象,用于保存上传的文件。同时,我们定义了一个 fileFilter
回调函数,用于过滤非图片文件。
启动应用
最后,我们在 index.ts
文件中启动应用:
-- -------------------- ---- ------- ------ ------- ---- --------- ------ -------- ---- ---------- ------ ---- ---- ------ ------ - ----- ------------ ----------- - ---- ---------- ------ - ----------------------- ------------------ - ---- -------------- ------ - ------ - ---- ---------- ----- --- - --------- ----------------------- -------------- ------- ----------- --- --------------- --------------------------- ------------------------------- ---------------------------------------- -- -- - ---------------------- -- --------- ---------------- -- -- - ------------------- -- --------- -- -------------------------- -- --
上述代码中,我们使用 mongoose
连接 MongoDB 数据库,并使用 express
启动应用。在启动应用前,使用 use()
方法添加中间件、路由等。
总结
本文介绍了如何使用 TypeScript 和 Node.js 开发 RESTful API,实现了用户注册、登录、注销、博客的增删改查,文件上传和下载等功能。通过本文的实际案例,相信大家已经掌握了 TypeScript 下使用 Node.js 开发 RESTful API 的基本流程和思路。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64f047e6f6b2d6eab3a41da5