写在前面的话
近来在进修Egg.js,它是阿里推出的基于Koa的node开辟框架,为企业级框架和运用而生。Egg.js 的官方文档已很完美了,想进修Egg.js的能够直接检察官方文档。
由于寻常开辟都是前后端星散的形式,就想着运用Egg建立背景效劳,写一套API接口合营其他的项目。该项目标手艺栈用到了Egg.js、MongoDB、mongoose。这篇文章纪录一下我写注册登录模块和用户中间模块的历程,目标是实时归结进修历程,磨炼文档才能,和人人举行分享交换,共同进步。
项目所在: Egg-API
项目延续更新中,喜好的请点心,关注,star ,fork,这些是我历久坚持下去的动力 (。_ 。) ✎_
以下是正文
需求剖析
关于注册上岸模块,需求剖析以下:
- 注册成为新用户,对输入的数据举行校验
- 上岸进入体系,需要对输入的数据举行校验,基于token鉴权认证
- 登出功用
- 上岸进去能够在用户中间模块检察个人信息
- 在用户中间模块修正个人信息
数据剖析设想
显式数据:
- userName: String 用户名
- userPass: String 账号暗码
- userEmail: String 用户邮箱
- telphone: String 手机号
- avatar: String 头像
- age: Number 岁数
- sex: String 性别
- City: String 都市
隐式数据:
- userRole: Number 用户角色(1.普通用户、 2.管理员、 3.超等管理员,默许用户为普通用户,超等管理员在建立数据库的时刻建立)
- userCreate: Date 用户建立时候
- lastLoginTime: Date 上次登录时候
- laseLoginPlace: String 上次登录所在
API剖析设想
下文接口申明中的api指接口名,params指传入的数据,code指响应效果标识码,msg指响应效果信息申明,data指响应胜利返回的数据
注册接口
api: /api/v1/signup (post)
params: {
userName: String, // 用户名,具有唯一性
userPass: String, // 用户暗码
userEmail: String, // 用户邮箱
}
code: 1、注册胜利 0:输入信息不完美或有误 -1:注册失利,该用户名已存在
msg: 响应返回的信息申明
data: {
_id: _id,
userName: 用户名,
token: 天生的token,
}
登录接口
api: /api/v1/signin (post,要求头带token)
params: {
userName: String, // 用户名
userPass: String, // 用户暗码
}
code: 1、登录胜利 0:输入信息不完美或有误 -1:用户不存在
msg: 响应返回的信息申明
data: {
_id: _id,
userName: 用户名,
lastLoginTime: 上次登录时候,
lastLoginPlace: 上次登录所在,
}
登出接口
api: /api/v1/signout (get)
code: 1、登出胜利,前端退出体系并清空token
msg: 登出响应返回信息申明
data: {}
检察个人信息接口
api: /api/v1/user/userName (post,要求头带token)
params: {
userName: String,
}
code: 1、查询胜利 0、输入信息不完美 -1、查询失利
msg: 查找个人信息返回信息申明
data: {
userName: 用户名,
userEmail: 用户邮箱,
age: 岁数,
city: 都市,
......
}
变动个人信息接口
api: /api/v1/user/userName (put,token)
params: {
...... // 变动的信息
}
code: 1、更新胜利 0、输入信息不完美或有误 -1、更新失利
msg: 更新个人信息返回信息申明
data: {
userName: 用户名,
......
}
编码完成
注:编码完成申明只提供部份,完全内容请移步Egg-API
假定你已初始化好了一个项目,项目标目次构造商定和官方的一致。由于我们要运用MongoDB数据库,所以要先装置egg-mongoose,并在配置文件里写入:
// config/plugin.js
exports.mongoose = {
enable: true,
package: 'egg-mongoose',
};
// config/config.default.js
config.mongoose = {
url: 'mongodb://127.0.0.1/apiExample',
options: {},
};
在model文件夹定义我们的schema文件:
const UserSchema = new Schema({
userName: { type: String, unique: true, required: true, },
});
路由定义:
router.post('/api/v1/signup', controller.user.signup);
controller编写:用于剖析用户的输入,处置惩罚后返回响应的效果。我们能够把猎取到的数据放到render中举行衬着,然后把衬着后的效果发给游览器,或许,也能够把数据直接赋值给ctx.body,然后以json体式格局返回。
class UserController extends Controller {
// 登录
async signin() {
const { ctx } = this;
const rule = {
userName: { type: 'string', required: true, message: '必填项' },
userPass: { type: 'string', required: true, message: '必填项' },
};
const signinMsg = ctx.request.body;
await ctx.validate(rule, signinMsg);
signinMsg.userPass = ctx.helper.encrypt(signinMsg.userPass);
const result = await ctx.service.user.signin(signinMsg);
ctx.body = result;
}
}
service编写:用于编写营业逻辑层,能够复用。庞杂数据的处置惩罚,比如要展示的信息需要从数据库猎取,或许是第三方效劳的挪用。
class UserService extends Service {
// 更新用户信息
async updateUser(userMsg) {
const { ctx } = this;
const res = {};
const result = await ctx.model.User.findByIdAndUpdate(userMsg._id, userMsg);
res.code = 1;
res.msg = '用户信息已变动';
res.data = result;
return res;
}
}
一个简朴的node运用构造就是如许,云云便完成了用Egg.js担任接口效劳。