Egg.js搭建背景效劳API

写在前面的话

近来在进修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担任接口效劳。

    原文作者:levinhax
    原文地址: https://segmentfault.com/a/1190000015767772
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞