egg的入门使用
egg是为节省开发成本而生的
express是node.js使用比较广泛的框架 ,简单并且扩展性强,写比较小的项目比较方便,但是在写比较大的项目时,
他就缺少了规范约定,容易造成开发困难,团队不便于协作,开发人员死蹲点现象;
于是egg应运而生,egg将后端请求接口进行封装,减少开发人员浪费,团队协作方便,各司其职,开发扩展性极强,
沟通成本大幅度降低,将需要的插件机制优化,实现了一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业
务场景定制配置,这样应用的开发成本就变得很低。
egg拥有以下特性
安装方式
npm init egg --type=simple //初始化包 npm i //将package.json里的包装上 npm run dev //启动项目
使用
// app.js
//不管请求成功与否
module.exports = app => {
//一次worker进程只会调用一次,会将http的server事件暴漏给开发者 app.once('server', server => { // websocket });
//在这次进程运行中检测到错误时都会触发,将错误对象和上下文暴漏给开发者,进行自定义的日志记录等处理 app.on('error', (err, ctx) => { // report error });
//应用收到请求和响应请求时,分别会触发request
和response
事件,并将当前请求上下文暴露出来,开发者可以监听这两个事件来进行日志记录。 app.on('request', ctx => { // log receive request }); app.on('response', ctx => { // ctx.starttime is set by framework const used = Date.now() - ctx.starttime; // log total cost }); };
class UserController extends Controller { async fetch() { this.ctx.body = this.ctx.app.cache.get(this.ctx.query.id); } } //在egg中要获取ctx,是在this上的
//管理者(简单任务分发) //app/controller/home async register() { // 判断是否已被占用 const { ctx, service } = this; const name = ctx.request.body.name; const password = ctx.request.body.password; const result = await service.home.checkUser({ name }) if(result.code === 0) { this.ctx.body = result } else { if(result.isExists) { // 已存在 this.ctx.body = { code: 10001, msg: '此用户名已被占用' } } else { // 不存在,继续注册 const registerRes = await service.home.register({name, password}) ctx.body = registerRes } } console.log('查询结果', result) // if(result.isRegister) { // // 没有被注册过 // // 写入数据库 // await this.service.home.register(); // } else { // this.ctx.body = { // code: 0, // msg: '已注册' // } // } } }
//普通人员(脏活累活,处理数据库等) //app/service/user async checkUser(obj) { try { const userInfo = await this.app.mysql.query('select * from users where name=?', obj.name); return { code: 1, isExists: userInfo.length > 0, }; } catch (err) { return { code: 0, msg: err.message, }; } } async register(user) { try{ await this.app.mysql.insert('users', user) return { code: 1, msg: '注册成功' } } catch(e) { return { code: 0, msg: e.message } } }
post请求(如果直接用会报错)
//config/config.default.js //学习阶段 //添加 exports.security = { csrf: false };
这样会把判断安全的egg-security插件禁用掉,也就不会向你索要认证头了
如果需要链接数据库的话
$ npm i --save egg-mysql //下载命令 //开启插件 //config/plugin.js exports.mysql = { enable: true, package: 'egg-mysql', }; //配置 //config/config.default.js exports.mysql = { // 单数据库信息配置 client: { // host host: 'mysql.com', // 端口号 port: '3306', // 用户名 user: 'test_user', // 密码 password: 'test_password', // 数据库名 database: 'test', }, // 是否加载到 app 上,默认开启 app: true, // 是否加载到 agent 上,默认关闭 agent: false, }; //使用 const user = await this.app.mysql.get('users', { id: 11 });