Egg.js 为企业级框架和应用而生。基于Koa开发封装,性能优异,内置多进程管理,具有高扩展性,且提供了基于Egg定制上层框架的能力,帮助开发团队降低了开发维护成本。
npm init egg --type=simple
npm i
npm run dev
如上,由框架约定的目录:
app/router.js
用于配置 URL 路由规则。app/controller/**
用于解析用户的输入,处理后返回相应的结果。app/service/**
用于编写业务逻辑层。app/middleware/**
用于编写中间件。app/public/**
用于放置静态资源。app/extend/**
用于框架的扩展。config/config.{env}.js
用于编写配置文件。config/plugin.js
用于配置需要加载的插件。test/**
用于单元测试。app.js
和 agent.js
用于自定义启动时的初始化工作。由内置插件约定的目录:
app/public/**
用于放置静态资源。app/schedule/**
用于定时任务。若需自定义自己的目录规范
app/view/**
用于放置模板文件。app/model/**
用于放置领域模型。module.exports = appInfo => {
/**
* built-in config
* @type {Egg.EggAppConfig}
**/
const config = exports = {
// 文件上传
// https://eggjs.org/zh-cn/basics/controller.html#获取上传的文件
multipart: {
mode: 'file',
fileSize: '50mb', // 接收文件大小
whitelist: [ // 允许接收的文件类型
'.png',
'.jpg'
],
}
};
config.wxApp = {
one: {
appid: '',
secret: '',
},
};
// use for cookie sign key, should change to your own and keep security
config.keys = appInfo.name + '_1617193772184_9015';
config.jwt = {
secret: '',
};
config.security = {
csrf: {
enable: false,
ignoreJSON: true
},
//允许8080访问接口
domainWhiteList: ['http://localhost:8080']
};
//跨域配置
config.cors = {
origin:'*',
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS'
};
config.sequelize = {
dialect: 'mysql',
port: '3306',
// 本地测试数据库
host: '',
database: '',
username: '',
password: '',
pool: {
max: 5,
idle: 30000,
acquire: 60000,
},
dialectOptions: {
charset: 'utf8mb4',
collate: 'utf8mb4_unicode_ci',
},
timezone: '+08:00',
define: {
freezeTableName: true,
timestamps: false,
},
};
// add your user config here
const userConfig = {
// myAppName: 'egg',
};
config.view = {
mapping: {
'.html': 'ejs',
},
};
config.cluster = {
listen: {
path: '',
port: 7001,
hostname: '127.0.0.1',
}
}
return {
...config,
...userConfig,
};
};
router.get(path, controller);
示例
module.exports = app => {
const { router, controller } = app;
router.get('/userList', controller.list.UserListIndex); // 用户列表
};
Controller 可以调用任何一个 Service 上的任何方法
示例
const Controller = require('egg').Controller;
class ListController extends Controller {
// 查看所有用户
async UserListIndex() {
const { ctx } = this;
const userListData = await this.service.list.getUserList();
if (userListData) {
ctx.body = {
code: 0,
message: '成功',
data: userListData,
}
} else {
ctx.body = {
code: 1,
message: '失败',
}
}
};
}
module.exports = ListController;
在 Controller 中通过 this.ctx 可以获取上下文对象,方便获取和设置相关参数,例如:
ctx.query:URL 中的请求参数(忽略重复 key)
ctx.quries:URL 中的请求参数(重复的 key 被放入数组中)
ctx.params:Router 上的命名参数
ctx.request.body:HTTP 请求体中的内容
ctx.request.files:前端上传的文件对象
ctx.getFileStream():获取上传的文件流
ctx.multipart():获取 multipart/form-data 数据
ctx.cookies:读取和设置 cookie
ctx.session:读取和设置 session
ctx.service.xxx:获取指定 service 对象的实例(懒加载)
ctx.status:设置状态码
ctx.body:设置响应体
ctx.set:设置响应头
ctx.redirect(url):重定向
ctx.render(template):渲染模板
Service 文件必须放在 app/service 目录,支持多级目录,访问的时候需要通过目录名级联访问
const Service = require('egg').Service;
class ListService extends Service {
// 引入表
MODEL = this.app.model.User;
User = this.MODEL.User;
Role = this.MODEL.Role;
// 查询所有用户信息
async getUserList() {
return await this.User.findAll({
include: {
model: this.Role,
}
});
};
}
module.exports = ListService;
示例
npm i cors --save
然后在 config/plugin.js 中启用该插件
module.exports = {
cors: {
enable: true,
package: 'egg-cors',
}
};