前言
前端工程师一般都需要了解后台相关的知识,特别是对于一些大型项目,我们需要使用一些后台技术来满足复杂的业务需求。本文将带您了解如何使用 Koa2 实现一个完整的后台管理系统,从搭建环境到处理 HTTP 请求,以及使用数据库操作数据等方面进行详细介绍。
准备工作
在开始搭建后台系统之前,您需要安装 Node.js 和 npm,如果您已经安装了,请跳过此步。
- 访问 Node.js 官方网站,下载并安装最新版本的 Node.js;
- 安装完成后,在终端或命令行中输入
node -v
和npm -v
命令,检查安装是否成功。
搭建 Koa2 项目
以下是使用 Koa2 搭建后台管理系统的完整步骤:
创建项目文件夹
在您的工作目录下,创建一个新的文件夹,用作项目的根目录。
初始化项目
通过终端或命令行进入项目根目录,执行以下命令:
npm init
您可以一路回车,直到生成
package.json
文件。安装依赖
在终端或命令行中,执行以下命令:
npm install koa koa-body koa-router koa-static koa-views pug sequelize mysql2 jsonwebtoken require-directory koa-jwt
这些依赖包包括了 Koa2 的基础模块以及一些实用工具。
创建服务器
在项目根目录下新建
app.js
文件,用于创建服务器和配置公共中间件。-- -------------------- ---- ------- ----- --- - -------------- ----- ------------ - ------------------------------------- ----- ---------- - ------------------- ----- ------ - ------------------- ----- ------ - ------------------ ----- - ------ - - ------------------- ----- --- - --- ----- -- -- ----------- --- ----------------------- -- -- ---------- --- --------------------- -- -- ------ --- ---------------- ------ ----------- ----- ----------- --- -- ------ --- - ------------------------ ------------------------ ---------------- -- -- - ------------------- ------- -- ----------------------- --
展开代码以上代码中,我们引入了一些中间件,例如
koa-body
来解析 HTTP 请求体,koa-jwt
来验证 JWT token。koa-router
是一个路由库,可以方便地创建和管理路由。在./config.js
中存储了一些配置信息,errorHandler
是一个自定义的错误处理器。创建路由
在项目根目录下新建一个
routes.js
文件,用于管理 HTTP 请求路由。-- -------------------- ---- ------- ----- ------ - ----------------------- ----- -------------- - --------------------------------------- ----- -------------- - --------------------------------------- -- ------ ------------------------ ------------------------ ------------------------- -------------------------- ---------------------------- --------------------------- ---------------------------- ------------------------------ ------------------------------- ------------------------------ -- ---- --------------------- --------------------- -------------- - ------
展开代码以上代码中,我们创建了一些例子路由用于管理用户请求。在
authController
文件中处理登录请求。创建数据库
在
/models
文件下创建一个index.js
文件,用于初始化和配置 Sequelize,这是一个 Node.js 中操作 MySQL 数据库的库。-- -------------------- ---- ------- ----- -- - ------------- ----- ---- - --------------- ----- --------- - -------------------- ----- - --------- --------- -------- - - -------------------- ----- --------- - --- ------------------- --------- --------- - ----- ------------ -------- -------- ----- - ---- -- ---- -- -------- ------ ----- ----- -- -------- ----- -- -------------------------------- - -------- -- - --- ---- - -- --- ---------- - --------------- --- ---- --- -- ----------- - -- --------------------------------- -------- --- ----- - --------------- -- ------------- -- ------- ----- --- -------- -- ----------------- --- ------- - --------- - -------------------------- - -------- - ---------------- - ---- - --------- - ----- - - ------ ---- - -- -- ------ --------- ----- ----- - ----------------------------------- ---------- -- -- ------ --- ---- ---- -- ------ - ----- ----- - ---------------------------- --------- ----------------- -------------------- --------------------- - ----- - -- ---- ------------------------------------------ -- - -- -------------------------------- - ----------------------------------------- - -- ---------------- ------ ----- -- ------------- ---- --------- -- -------------- - ---------
展开代码以上代码中,我们引入了一些模块,例如
fs
和path
来读取模型文件并获取模型的绝对路径。Sequelize
接受连接数据库的一些参数进行初始化,并初始化了一个toJSON
方法,用于将从数据库中读取到的数据转换为 JSON 格式。接着,我们使用
fs.readdirSync
函数读取/models
文件夹下的内容,并且将所有读取到的文件通过require
函数导入并将其包裹在sequelize.define
函数中,得到一个 Sequelize 的 Model 实例,并将其挂载到sequelize
对象上。在
/models
文件夹下创建一个user.js
文件,定义用户的数据结构。-- -------------------- ---- ------- ----- - --------- - - -------------------- -------------- - ----------- -- - ----- ---- - ------------------------ - --- - ----- ------------------ ----------- ----- ---------- ------ -------------- ---- -- ----- - ----- --------------------- ---------- ------ ------------- -- -- ------ - ----- ---------------------- ---------- ------ ------------- -- -- --------- - ----- --------------------- ---------- ------ ------------- -- -- ----- - ----- ---------------------- --------- ---------- ------ ------------- ------ - -- ------ ---- -
展开代码此时我们完成了数据库的初始化和模型的定义,接下来我们需要创建与数据库的连接,并且在服务启动时进行初始化和同步数据。
在
app.js
文件中创建:const database = require('./models') database.authenticate().then(() => { console.log('Database connected.') }).catch((error) => { console.log(`Failed to connect database: ${error}.`) })
关于 API 接口设计
在编写后台 API 接口时,我们需要遵循 RESTful API 的设计规范,具体步骤如下:
- 定义 RESTful 路径
- 绑定 HTTP 动词
- 通过 HTTP 状态码返回结果
下面是一个根据 RESTful 设计规范设计的路由器:
-- -------------------- ---- ------- ----- ------ - ----------------------- ----- -------------- - ---------------------------------------- -- -- ------- -- ----------------------------- -- -- ---- -- ---------------- ---------------------- -- ----- --------------- ----------------------- -- ------ ------------------ ----------------------- -- -- -- ---- ------------------ ---------------------- -- -- -- ---- --------------------- ----------------------- -- -- -- ---- -------------- - ------展开代码
在编写 API 接口时,我们需要对 HTTP 请求方法的返回值进行统一封装,例如:
-- -------------------- ---- ------- -------------- - ----- ------ - ----------------- ---- ---- - --- - --------- - ---- -------- - --- --------- - ---- - ------ ------------ - --- --- - ---------- - ------ --- ----------- ---- ----- - ------ --------- - ---- --- - ------- ---- - --- - ------ --- ------------ ---- ----- - -展开代码
以上代码封装了返回结果的数据结构,并提供了两个静态方法用于创建成功和失败的结果,这可以避免我们在每个接口中都自己写一遍返回结果的代码。
如何保护 API 接口
在编写 API 接口时,我们需要对 API 接口进行认证和授权,这可以使用 JSON Web Token(JWT)和授权中间件来实现。
JWT Token 身份验证
使用 JWT Token 进行身份验证时,我们需要为每个用户分配一个 JWT Token,Token 里包含了用户 ID 和过期时间等信息,当用户访问 API 接口时,我们需要拿到客户端传来的 Token 并对其进行验证。在本例中,我们可以通过引入 koa-jwt
中间件来实现 JWT 的身份验证,代码如下:
const koaJwt = require('koa-jwt') const { secret } = require('./config') app.use(koaJwt({ secret }).unless({ path: [/\/login/] }))
以上代码中,我们使用 koa-jwt
中间件来处理身份验证,unless
函数用于排除某些路由不认证(例如 /login
),secret
是我们在 config.js
中定义的秘钥用于加密和解密 Token。
接着,在登录 API 接口中,我们可以通过以下代码生成和签署 JWT 并将其返回给客户端:
const jwt = require('jsonwebtoken') const { secret } = require('../config') const token = jwt.sign({ id: userId }, secret, { expiresIn: '1d' }) ctx.body = Result.success({ token }, 'Login success.')
授权中间件
在进行了身份验证之后,我们还需要对资源的访问权限进行授权,这可以通过编写一个授权中间件来完成。
-- -------------------- ---- ------- ----- --- - ----------------------- ----- - ------ - - -------------------- -------------- - -------------- -- - ------ ----- ----- ----- -- - ----- ------------- - ------------------------ -- -------------- --- ---------- - -------- - ---------------- ------------------- ------ - ----- ----- - --------------------- ----- --- - ----- ------- - ----------------- ------- -- ------------- --- ------------- - -------- - ---------------- -------------- -------- ---- -- ------------------ ------ - ----- ------ - ----- ------- - -------- - ---------------- ------------------- - - -展开代码
以上代码中,我们定义了一个授权中间件,根据传入的参数 requiredRole
进行授权,并通过 jwt.verify
函数验证 Token 的有效性,验证成功后,将请求转发给下一个中间件。如果 Token 无效,则返回 Http 状态码 401(未认证)。
使用授权中间件非常简单,例如:router.post('/', auth('admin'), UserController.create)
。
如何处理错误
在使用 Koa2 进行开发时,我们需要在每个 API 接口中处理异常,这可以通过编写一个错误处理中间件来实现。以下是一个错误中间件的样例:
-- -------------------- ---- ------- -------------- - -- -- - ------ ----- ----- ----- -- - --- - ----- ------ - ----- ------- - -------------------- ----- ------ - ------------ -- --- ----- ------- - ------------- -- --------- ------ ------ ------------------- - ------ ----------------- - - ----- ------- ------- - - - -展开代码
在编写 API 接口时,我们应该捕获异常并将其抛出,这可以使我们在错误处理中间件中集中处理错误,例如:
-- -------------------- ---- ------- ----- -------- - -------------------- ----- ---- - ---------------- ----- ------ - -------------------------- -------------- - ----- -------------- - ------ ----- ------------ - ----- ----- - ----- -------------- -------- - ---------------- ----- -- - ------ ----- ------------ - ----- -- - ------------- ----- ---- - ----- ----------------- -- ------- - ----- - ------- ---- -------- ----- --- ------- - - -------- - ---------------- ---- -- - -- --- -展开代码
以上代码中,我们将 ctx.throw
函数换成了 throw
,这是为了将异常统一抛到错误处理中间件中。
如何测试 API 接口
在编写 API 接口时,我们需要对其进行测试以确保其正常运行。我们可以使用一些 API 调试工具,例如 Postman 或 Insomnia 来进行测试。下面是一些测试 API 的步骤:
启动服务器
在项目根目录下,执行
node app.js
启动服务器尝试访问服务器
打开浏览器或其它 API 调试工具,使用请求地址访问服务器,例如:http://localhost:3000
配置 API 调试工具
在 API 调试工具中填入请求地址及其它请求信息(例如请求头、请求体等),并发送请求。
注意:某些请求需要进行身份验证和授权操作,需要在 API 调试工具中设置相关的配置信息。
检查 API 响应
检查服务器返回的 HTTP 状态码和响应体时候符合预期。一些 API 调试工具可以帮助解析响应体的内容,例如 json 格式的数据。
结语
本文详细介绍了使用 Koa2 搭建后台管理系统的完整步骤,包括搭建环境、创建服务器、绑定路由、创建数据库、实现身份验证和授权、以及如何处理异常等方面的内容,并提供了示例代码以方便阅读和学习使用。希望本文可以帮助您更好地了解后台管理系统的开发流程,如果您有任何问题或建议,欢迎在评论区留言。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6780a28ece7f4861254353d3