Node.js从入门到放弃(十)


前言


这是该系列文章的最后一篇,主要介绍egg框架的基本使用


安装

npm i egg-init -g
egg-init egg-demo --type=simple
cd egg-demo
npm i

运行

npm run dev

脚手架目录结构

Node.js从入门到放弃(十)_方法名


访问首页

Node.js从入门到放弃(十)_方法名_02

静态资源开放


脚手架生成的目录结构中,public路径本身没有被开放,访问时public还是要写上的,如127.0.0.1:7001/public/xxx


模板引擎

安装:npm i egg-view-ejs

配置

//app_root/config/plugin.js
exports.ejs = {
enable: true,
package: 'egg-view-ejs',
};

//{app_root}/config/config.default.js
config.view = {
mapping: {
'.html': 'ejs',
},
};

使用

Node.js从入门到放弃(十)_中间件_03

Node.js从入门到放弃(十)_方法名_04

效果图

Node.js从入门到放弃(十)_目录结构_05

路由


egg 基于koa2封装,在方法调用上采用async ,await 形式,路由上采用内置路由


demo

'use strict';

const Controller = require('egg').Controller;

class HomeController extends Controller {
//注意:这里方法名index,与接下来使用的路由相关
async index() {
const { ctx } = this;
ctx.body = 'hi, egg';
}
}

module.exports = HomeController;
'use strict';

module.exports = app => {
const { router, controller } = app;
//注意:这里controller.home.index中的index,对应控制器中的index方法
router.get('/', controller.home.index);
};

this与ctx


  • egg 中的上下文是基于koa封装的,不能直接用ctx.body,而是:this.ctx.body,
  • 习惯使然,可以把ctx从this单独解构出来 const { ctx } = this

get参数获取(this.ctx.query)

get动态路由

Node.js从入门到放弃(十)_方法名_06

服务


egg 对目录结构有严格限制,service文件夹用于放置相关服务。除了控制器调用服务外,服务之间也可以相互调用,方式与前者一致。


新建服务

Node.js从入门到放弃(十)_目录结构_07

使用服务

Node.js从入门到放弃(十)_方法名_08

渲染

Node.js从入门到放弃(十)_方法名_09

效果图

Node.js从入门到放弃(十)_方法名_10

扩展


egg 除了本身的一些内置功能外,还支持扩展功能。定义方式很简单,app目录下新建extend文件夹,支持的类型有5个,application,context,helper,request,response,文件名必须严格为这五种类型的名字


使用helper 对时间格式进行扩展

Node.js从入门到放弃(十)_目录结构_11

使用

this.ctx.helper.format(new Date())

效果图

2019-8-22 2:53:02 PM

中间件

使用流程:


  • app目录下新建middleware文件夹
  • middleware文件夹下新建forbiddenIp.js
  • 书写封禁方法

module.exports = options => {
return async (ctx, next) => {
if (options.ip === '127.0.0.1') {
ctx.status = 403;
ctx.body = "您的IP已经被封禁";
} else {
await next();
}
}
}
  • 除了可以写匿名函数,也可以写命名函数
module.exports = options => {
const forbiddenIpMiddleware = async (ctx, next) => {
if (options.ip === '127.0.0.1') {
ctx.status = 403;
ctx.body = "您的IP已经被封禁";
} else {
await next();
}
}

return forbiddenIpMiddleware;
}

在config.default.js中配置

config.middleware = ['forbiddenIp'];//forbiddenIp必须和中间件的文件名相同,而不是和方法名相同
config.forbiddenIp={
ip:"127.0.0.1"
}

效果图

Node.js从入门到放弃(十)_目录结构_12


Node.js从入门到放弃(十)_目录结构_13