开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
前言
改造完用户接口后,我们继续来进行角色模块的接口编写。大体上需要的接口有增删改查角色、获取角色列表等。其中会与用户角色表有关联的接口只有删除角色接口,其它增改查不涉及对角色id的修改。所以我们本文着重来写一下增、删角色接口,其它与用户模块的接口大同小异,大家可以参考着写。
添加角色接口
添加角色的接口逻辑比较简单。还是校验入参然后数据入库的流程。
校验入参规则
schema/role.js
const joi = require('joi');
/**
* string() 值必须是字符串
* alphanum() 值只能是包含 a-zA-Z0-9 的字符串
* min(length) 最小长度
* max(length) 最大长度
* required() 值是必填项,不能为 undefined
* pattern(正则表达式) 值必须符合正则表达式的规则
*/
// 角色名的校验规则
const role_name = joi.string().min(1).max(10).required();
// 定义 id, nickname, emial 的验证规则
const role_id = joi.number().integer().min(0).required();
const remark = joi.string();
const status = joi.number().valid(0, 1);
// 角色id数组
const role_ids = joi.array().items(joi.number()).required();
// 分页参数
const pageSize = joi.number().required();
const currentPage = joi.number().required();
// 添加角色的验证规则对象
exports.add_role_schema = joi.object().keys({
// 对res.body对象进行验证
role_name,
remark,
status
});
// 获取角色列表的验证规则对象
exports.get_role_list_schema = joi.object().keys({
pageSize,
currentPage,
role_name: joi.string().min(1).max(10)
});
// 修改角色的验证规则对象
exports.edit_role_schema = joi.object().keys({
role_name,
remark,
status
});
// 删除角色的验证规则对象
exports.delete_role_schema = joi.object().keys({
role_ids
});
// 获取单角色的验证规则对象
exports.get_role_schema = joi.object().keys({
// 对query参数进行验证
role_id
});
路由
router/role.js
const express = require('express');
// 创建路由对象
const router = express.Router();
const roleHandler = require('../router_handler/role');
// 添加角色
router.post('/addRole', roleHandler.addRole);
路由回调
const RoleModel = require('../model/roles');
// 导入需要的验证规则对象
const {
get_role_list_schema,
add_role_schema,
edit_role_schema,
delete_role_schema,
get_role_schema
} = require('../schema/role');
// 添加角色接口
exports.addRole = (req, res) => {
const { value, error } = add_role_schema.validate(req.body);
if (error) throw error;
RoleModel.create(value).then(function (role) {
if (!role) {
return res.send({
code: 1,
message: '创建失败',
data: null
});
}
return res.send({
code: 0,
message: '创建成功',
data: role
});
});
};
删除角色接口
删除角色的接口的实现步骤如下:
- 校验是否有角色id数组
- 获取要删除的角色id数组
- 删除对应角色表中角色id数组的角色id
- 对用户角色表中的含角色id的记录进行删除
所以我们先在角色模型中定义好删除的方法,再进行路由的编写。
model/role.js
这里我们还是采用事务的写法,有异常即回滚。
const UsersRolesModel = require('./users-roles');
...
const RolesModel=sequelize.define(...)
// 删除角色的方法
RolesModel.delRole = async function (role_ids) {
const t = await sequelize.transaction();
try {
// 删除角色表中角色id数组的角色
await RolesModel.destroy({
where: { role_id: role_ids }
});
// 删除用户角色表中角色id数组的角色记录
await UsersRolesModel.destroy({
where: { role_id: role_ids }
});
t.commit();
return true;
} catch (e) {
t.rollback();
return false;
}
};
...
路由
router/role.js
// 删除角色
router.post('/delRole', roleHandler.deleteRole);
路由回调
router_handler/role.js
// 删除角色接口
exports.deleteRole = (req, res) => {
const { value, error } = delete_role_schema.validate(req.body);
if (error) throw error;
const role_ids = value.role_ids;
// 对应角色id数组进行删除
RoleModel.delRole(role_ids || []).then(function (role) {
if (role !== true) {
return res.send({
code: 1,
message: '删除失败',
data: null
});
}
return res.send({
code: 0,
message: '删除成功',
data: role
});
});
};
测试
-
在主文件中添加角色模块 app.js
... app.use('/user',userRouter) // 导入并注册用户角色模块 const roleRouter = require('./router/role'); app.use('/user/role', roleRouter); ... -
添加角色路由测试
-
删除角色路由测试
那么我们角色模块到这里就完成了,剩下的接口大家可以自行对应用户模块的写法自行完成。最后附上所有路由。