npm init egg --type=simple
npm install
npm run dev
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xOA1kRN6-1625839895420)(E:\notebook\Egg.js.assets\image-20210522181804542.png)]
启动成功!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vz8CzwjF-1625839895426)(E:\notebook\Egg.js.assets\image-20210522182330818.png)]
系统开发文件,内有controller、public目录和router文件
public目录中存放静态资源文件,其中的静态资源可以通过url直接访问到,如图中的demo.html,可直接通过http://localhost:7001/public/demo.html访问
存放配置文件,config.default.js内有项目配置,plugin.js用于配置插件
controller
const Controller = require("egg").Controller
class FruitsController extends Controller{
async index(){
// this.ctx是上下文对象
this.ctx.body = "我是水果"
}
}
module.exports = FruitsController
router.js
router.get("/fruits", controller.fruits.index)
访问http://localhost:7001/fruits即可访问到
普通风格
Controller类中的上下文对象this.ctx中有query属性,用于存放get请求的参数
async index(){
let query = this.ctx.query
console.log(query);
this.ctx.body = `我是水果${query.index}` //上下文对象
}
请求http://127.0.0.1:7001/fruits?index=100
页面显示为:我是水果100
打印出的值为:{ index: ‘100’ }
fastful风格
router.js中添加
router.get("/fruits/:id", controller.fruits.getId)
fruits.js中添加getId方法
async getId(){
let id = this.ctx.params.id
this.ctx.body = `id为${id}`
}
通过this.ctx.params.定义的参数名获取参数
修改config.default.js文件,关闭其 csrf认证
config.security = {
csrf:{
enable: false,
},
};
router.js中添加路由
router.post("/createfruit", controller.fruits.createFruit)
fruits.js中获取请求参数
async createFruit(){
let fruit = this.ctx.request.body
this.ctx.body = fruit
}
router的简化
// router.resources("接口名", "接口url", "控制器")
router.resources("fruits", "/fruits", controller.fruits)
fruits.js
async index() {
this.ctx.body = fruitsList
}
async new() {
//添加页面 url为 /new
this.ctx.body = `
<form method='post' action='/fruits'>
<input name = 'fruitname'/>
<button>添加</button>
</form>
`
}
async create(){
// 添加数据
let fruit = this.ctx.request.body
fruitsList.push(fruit.fruitname)
// get跳转/fruits
// 重定向
this.ctx.redirect("/fruits")
}
async destroy(){
// 删除数据
}
async update(){
// 修改数据
}
安装
npm install --save egg-view-nunjucks
plugin.js引入插件
nunjucks:{
enable: true,
package: 'egg-view-nunjucks'
}
config.default.js配置默认模板引擎
config.view = {
defaultViewEngine: 'nunjucks'
}
模板文件写在app/view中
在controller/home.js中调用模板index.html
async index() {
const { ctx } = this;
// 使用index模板
await ctx.render("index", {fruits:["香蕉","苹果"]})
}
在index.html中使用数据
<ul>
{% for item in fruits%}
<li>{{item}}</li>
{% endfor%}
</ul>
此插件解决跨域问题
下载
npm install --save egg-cors
plugin.js配置
cors:{
enable: true,
package: 'egg-cors'
}
config.default.js配置
config.cors = {
origin: "*",
allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH'
}
下载
npm install --save egg-jwt
plugin.js配置
jwt:{
enable:true,
package: "egg-jwt"
}
config.default.js配置
config.jwt = {
secret:"qianbaobao"
}
jwt的使用
async index(){
let user = {
username: "xiaoming"
}
// 调用引入的token插件
const jwt = this.app.jwt
const secret = this.app.config.jwt.secret
// 生成token签名
let token = jwt.sign(user, secret)
// 解析token
let decode = jwt.verify(token, secret)
this.ctx.body = [token,decode]
}
jwt解析token得到对象与签发token的时间戳
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PgUrqRAM-1625839895431)(E:\notebook\Egg.js.assets\image-20210525185045527.png)]
在app目录中新建middelware目录用于存放中间件
function checktoken() {
return async function (ctx, next) {
//TODO
}
}
module.exports = checktoken
使用中间件,router.js中,将中间件写在url与方法之间,即可启用中间件
router.get('/jwtmessage', app.middleware.checktoken(), controller.jwt.getMessage)
下载
npm install --save egg-sequelize mysql2
plugin.js引入插件
sequelize:{
enable: true,
package: 'egg-sequelize'
}
config.default.js配置
config.sequelize = {
dialect: 'mysql',
database: 'egg_demo',
host: '192.168.129.130',
port: 3306,
username: 'root',
password: 'root',
timezone: '+08:00'
}
MySQL | sequelize |
---|---|
varchar(255) | STRING |
int | INTEGER |
double | DOUBLE |
datetime | DATE |
text | TEXT |
在app/model目录中创建xxx.js,将对应数据库中的xxx表
// 班级表id name
module.exports = app => {
// 获取数据类型
const {STRING} = app.Sequelize
const Clazz = app.model.define('clazz', {
// 自动生成id
name: STRING
})
return Clazz
}
在根目录中新建app.js文件
// 系统启动时执行
module.exports = app =>{
app.beforeStart(async function(){
// 根据app/model中的模型创建数据库表
// await app.model.sync({force: true}) //启动时清空数据
await app.model.sync({})
})
}
在Controller中的增删改查
this.app.model.Clazz.findAll()//查询数据
this.app.model.Clazz.findAll({where:{id:1}})//条件查询
this.app.model.Clazz.create({name: 'xxx'})//添加数据
this.app.model.Clazz.update({name:'xx'}, {where:{id:1}})//修改数据
this.app.mode.Clazz.destroy({where:{id:1}})//删除数据
service/student.js中
async getStudentList() {
try {
let studentList = await this.app.model.Student.findAll()
return studentList
} catch (error) {
return null
}
}
controller中调用
async index(){
let list = await this.ctx.service.student.getStudentList()
if (list) {
this.ctx.body = {
code: 2000,
data: list
}
} else {
this.ctx.body = {
code: 5000,
msg: '服务器异常'
}
}
}