TypeScript 下使用 Node.js 开发 RESTful API 的实际案例

阅读时长 16 分钟读完

随着前端技术的不断发展,Node.js 作为后端开发的一个重要选择,在开发 RESTful API 的过程中,也成为了不可或缺的角色。而 TypeScript 这个静态类型语言,可以极大地提高开发效率和代码可维护性。本文将介绍一个实际案例,带大家一步步学习在 TypeScript 下使用 Node.js 开发 RESTful API。

实际案例背景

我们假设有一个简单的需求,需要开发一个博客系统后端,实现以下功能:

  • 用户注册、登录、注销;
  • 博客的增删改查;
  • 文件的上传和下载。

开发环境搭建

首先,我们需要搭建开发环境,安装以下工具:

  • Node.js:可以到官网下载和安装;
  • TypeScript:可以通过 npm 安装;
  • MongoDB:可以到官网下载和安装;
  • Postman:测试 RESTful API 的工具,可以到官网下载。

接下来,我们创建一个空的 Node.js 项目。使用以下命令初始化项目:

然后,我们安装以下依赖:

上面的依赖中,expressbody-parser 是用于创建和解析 HTTP 请求的,mongoose 是用于操作 MongoDB 的,multer 是用于处理文件上传的,jsonwebtokenbcryptjs 是处理用户认证和密码加密的,cors 是处理跨域访问的。typescript 是 TypeScript 的运行环境,@types/* 是用于添加 TypeScript 安装的第三方库类型定义文件(声明文件)。

代码实现

接下来,我们来实现上述功能。为了提高可维护性和可读性,我们将代码分成多个文件来实现。

配置

首先,我们新建一个 config.ts 文件,用于配置应用的一些变量和选项:

上述配置中,PORT 是应用监听的端口,SECRET_KEY 是 JWT 生成 token 和验证 token 的密钥,MONGODB_URI 是 MongoDB 的连接地址,UPLOADS_DIR 是上传文件保存的目录,CORS_ORIGIN 是 CORS 的跨域访问源。

数据模型

接下来,我们定义数据模型,使用 Mongoose 来操作 MongoDB。新建 model.ts 文件:

-- -------------------- ---- -------
------ -------- ---- ----------

------ --------- ------- ------- ----------------- -
  ------ ------
  --------- ------
-

------ ----- ---------- - --- ----------------
  -
    ------ - ----- ------- --------- ---- --
    --------- - ----- ------- --------- ---- --
  --
  - ----------- ---- -
-

------ ----- ---- - ------------------------------- -----------

------ --------- ------- ------- ----------------- -
  ------ ------
  -------- ------
-

------ ----- ---------- - --- ----------------
  -
    ------ - ----- ------- --------- ---- --
    -------- - ----- ------- --------- ---- --
  --
  - ----------- ---- -
-

------ ----- ---- - ------------------------------- -----------

------ --------- ------- ------- ----------------- -
  --------- ------
  --------- ------
-

------ ----- ---------- - --- ----------------
  -
    --------- - ----- ------- --------- ---- --
    --------- - ----- ------- --------- ---- --
  --
  - ----------- ---- -
-

------ ----- ---- - ------------------------------- -----------

上述代码中,我们定义了三个数据模型:UserBlogFile。每个模型都有一个对应的 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

纠错
反馈