egg直接取req_Egg服务器基础功能

1. 框架约定目录规则

1.1 app/router.js:用于配置URL路由规则;

1.2 app/controller/** :用于解析用户的输入,处理后返回相应的结果;

1.3 app/service/**: 用于编写业务逻辑层;

1.4 app/public/**: 用于放置静态资源;

1.5 config/config.{env}.js: 用于编写配置文件;

1.6 config/plugin.js 用于配置需要加载的插件;

2.内置对象

1. Application:全局应用对象,在一个应用中,只会实例化一个对象;

在继承于 Controller, Service 基类的实例中,可以通过 this.app 访问到 Application 对象。

2. Request & Response:可以在 Context 的实例上获取到当前请求的 Request(ctx.request) 和 Response(ctx.response) 实例;

3. Controller:推荐所有的 Controller 都继承于该基类实现。该基类属性有:

ctx - 当前请求的 Context 实例。

app - 应用的 Application 实例。

service - 应用所有的 service。

4. Service:推荐所有的Service都继承该基类。

Service基类属性和 Controller 基类属性一致。

3.路由Router

路由是描述请求URL和具体承担执行动作的Controller的对应。说的直白点,就是用户访问不同的路径时应该有不同的Controller去响应不同的内容。

0cdef068004a59e803337d6558e5a437.png

4.控制器Controller

1. 控制器的定义以及和路由的关联

Controller负责解析用户的输入,处理后返回响应的结果。所有的Controller 文件都必须放在 app/controller目录下,支持多级目录,访问时可以通过目录名级联访问。如将Controller代码放到 app/controller/sub/post.js 中,则可以在 router 中这样使用:

// app/router.js
module.exports = app => {
app.router.post('createPost', '/api/posts', app.controller.sub.post.create);
}

同时,我们也可以自定义基类给控制器继承,官方案例如下:

// app/core/base_controller.jsconst { Controller } = require('egg');class BaseController extends Controller {get user() {return this.ctx.session.user;
}
success(data) {this.ctx.body = {
success: true,
data,
};
}
notFound(msg) {
msg = msg || 'not found';this.ctx.throw(404, msg);
}
}
module.exports = BaseController;

定义控制器继承他:

//app/controller/post.jsconst Controller = require('../core/base_controller');class PostController extends Controller {async list() {const posts = await this.service.listByUser(this.user);this.success(posts);
}
}

5.获取提交的数据

接收GET请求的数据:ctx.request.query 和 ctx.query.id;

接收POST请求的数据:ctx.request.body,而不是 ctx.body;post请求时,会有安全验证问题,简单的处理方式是关闭安全验证:

// config/config.default.js

// 配置安全验证

config.security = {

csrf: {

enable: false,

ignoreJSON: true,

}

}

Post数据默认大小是100kb,如需调整可在 config/config.default.js 中覆盖框架的默认值:

 module.exports = {                  bodyParser: {                          jsonLimit: '1mb',                          formLimit: '1mb',                  },};

接收路由参数:

// app.get('/projects/:projectId/app/:appId', 'app.listApp');// GET /projects/1/app/2class AppController extends Controller {  async listApp() {    assert.equal(this.ctx.params.projectId, '1');    assert.equal(this.ctx.params.appId, '2');  }}

6.获取上传的文件

记住了,你要先在 config 文件中启用 file 模式:

// config/config.default.js
exports.multipart = {
mode: 'file',
};

然后,你就可以参考下面的代码了:


这里的参考代码只处理一张图片,多张图片循环处理就可以了:

class UploadController extends Controller {

async file() {

const { ctx } = this;

const dest = '/public/upload/';

const file = ctx.request.files[0];

console.log(ctx.request.files);

let to = path.dirname(__dirname) + dest + path.basename(file.filepath);

// 处理文件,比如上传到云端 或 放到指定的目录

await fs.copyFileSync(file.filepath, to);

fs.unlinkSync(file.filepath);

console.log(dest);

// 返回图片路径

let cluster = this.app.config.cluster.listen;

ctx.body = `http://${cluster.hostname}:${cluster.port}${dest}${path.basename(file.filepath)}`;

}

}

7.Cookie

通过 ctx.cookies可以在 Controller 中便捷、安全的设置和读取 Cookie。

class CookieController extends Controller {async add() {const ctx = this.ctx;let count = ctx.cookies.get('count');
count = count ? Number(count) : 0;
ctx.cookies.set('count', ++count);
ctx.body = count;
}async remove() {const ctx = this.ctx;const count = ctx.cookies.set('count', null);
ctx.status = 204;
}
}

需要注意的是,cookie默认不支持中文,可以尝试转码,如encodeURI('中文egg'),然后再转回来decodeURI(ctx.cookies.get('username'));也可以通过加密的方式处理。

清除cookie把值设置为null即可。

在设置cookie时有个对象类型的可选参数,可以对cookie进行相关设置:

maxAge: 设置cookie的有效期,单位毫秒,默认浏览器关闭消失;

httpOnly:设置cookie是否允许js访问,默认true,不允许;

overwrite:如果设置为true,相同的键值对会被覆盖,否则发送两个;

signed:如果为true表示对cookie进行签名,不是加密,只是防止被篡改,注意在获取的时候也要提供该设置进行匹配;

encrypt:是否加密,true加密后客户端看不到明文,只能在服务器端获取,注意在获取的时候也要提供该设置进行匹配;

8.Session

Session 的使用方法非常直观,直接读取或者修改就可以,如果要删除它,直接将它赋值为 null:

class SessionController extends Controller {async deleteSession() {this.ctx.session = null;
}
};

注意:设置 session 属性时不要以 _ 开头,不能为 isNew

Session默认配置如下:

 exports.session = {         key: 'EGG_SESS',         maxAge: 24 * 3600 * 1000, // 1 天         httpOnly: true,         encrypt: true,};

也可以针对性设置有效期:

 // 如果用户勾选了 `记住我`,设置 30 天的过期时间if (rememberMe) ctx.session.maxAge = ms('30d');

重置session的有效期:当用户 Session 的有效期仅剩下最大有效期一半的时候

 // config/config.default.jsmodule.exports = {  session: {         renew: true,  },};

9.调用service

在 Controller 中可以调用任何一个 Service 上的任何方法,同时 Service 是懒加载的,只有当访问到它的时候框架才会去实例化它。

 // 调用 service 进行业务处理const res = await ctx.service.post.create(req);

10.发送HTTP响应

i. 设置status

// 设置状态码为 201this.ctx.status = 201;

ii. 设置body

ctx.body 是 ctx.response.body 的简写,不要和 ctx.request.body 混淆了;

// 响应内容this.ctx.body = '

Hello

';

iii. JSONP

app.jsonp() 提供的中间件来让一个 controller 支持响应 JSONP 格式的数据。在路由中,我们给需要支持 jsonp 的路由加上这个中间件:

// app/router.jsmodule.exports = app => {  const jsonp = app.jsonp();  app.router.get('/api/posts/:id', jsonp, app.controller.posts.show);  app.router.get('/api/posts', jsonp, app.controller.posts.list);};

在 Controller 中,只需要正常编写即可。用户请求对应的 URL 访问到这个 controller 的时候,如果 query 中有 _callback=fn 参数,将会返回 JSONP 格式的数据,否则返回JSON格式的数据。

可配置:

// config/config.default.jsexports.jsonp = {  callback: 'callback', // 识别 query 中的 `callback` 参数  limit: 100, // 函数名最长为 100 个字符};

iv. 重定向

Ø ctx.redirect(url) 如果不在配置的白名单域名内,则禁止跳转。

Ø ctx.unsafeRedirect(url) 不判断域名,直接跳转,一般不建议使用,明确了解可能带来的风险后使用。

用户如果使用ctx.redirect方法,需要在应用的配置文件中做如下配置:

// config/config.default.jsexports.security = {  domainWhiteList:['.domain.com'],  // 安全白名单,以 . 开头};

若用户没有配置 domainWhiteList 或者 domainWhiteList数组内为空,则默认会对所有跳转请求放行,即等同于ctx.unsafeRedirect(url)

aab2b17ad93e780c76b0d2eae31f64a7.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/520504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我和 Spring 大神的一天

先介绍一下故事的5位主人公。 Josh Long 龙之春: Spring 技术布道师,撰写过5部著作,录制过3部畅销的培训视频,是一位开源软件贡献者。 Spencer Gibb: Spring 技术布道师,Spring Cloud核心项目的联合创始人…

Android开发中解决自定义弹窗获取不到控件对象的问题

最近做期末作业的时候遇到一个功能需要在弹窗里修改账号密码,弹窗里面含有两个edittext控件,经过查阅资料我通过setView添加了一个view在弹窗里实现了,但是获取的控件对象一直为空导致我取不到输入的值,找了好久的错误原来获取对象…

是什么样的骚操作让应用上线节省90%的时间

优秀的程序员 总会想着 如何把花30分钟才能解决的问题 在5分钟内就解决完 例如在应用上线这件事上 通常的做法是 1. 构建项目 在本地用maven打包 每次需要clean一次,再build一次 2. 部署包 在本地ide、git/svn、maven/gradie 及代码仓库、镜像仓库和云平…

阿里程序员工作小技巧 | 理解CPU分支预测,提高代码效率

技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也会体现在优秀程序员在工作效率提升、产品性能优化和用户体验改善等小技巧方面的分享,以提高我们的工作能力。 从本期开始&am…

Spring Tools 4 for Eclipse 下载

https://spring.io/tools 注:如果双击不能运行,就先执行java -jar spring-tool-suite-4-4.6.0.RELEASE-e4.15.0-win32.win32.x86_64.self-extracting.jar 再次双击运行,就好使了。 注:这个文件夹放到什么地方,都可…

我花了一夜用数据结构给女朋友写个H5走迷宫游戏 | CSDN 博文精选

戳蓝字“CSDN云计算”关注我们哦!作者 | bigsai(同公众号)转自| CSDN博客责编 | 阿秃先看效果图(在线电脑尝试地址http://biggsai.com/maze.html):起因又到深夜了,我按照以往在公众号写着数据结构!这占用了我大量的时间…

异常:This application has no explicit mapping for /error, so you are seeing this as a fallback.

初学springboot配置好文件,测试接口出现这个是springboot的启动器要放在dao service…包的上层目录

安全看得见,阿里云性能监控 ARMS 全真3D拓扑实现一“屏”了然

微服务架构下,各类服务之间存在着错综复杂的依赖关系。一旦业务出现问题,追查问题源头就好比大海捞针,没有头绪。但业务不等人,此时,在最短的时间内定位问题根源是开发和运维人员对微服务监控产品的核心诉求。 传统的…

z变换判断稳定性和因果性_图像处理的仿射变换与透视变换

原文首发于微信公众号:【3D视觉工坊】。引言这一周主要在研究图像的放射变换与透视变换,目前出现的主要问题是需要正确识别如下图中的编码标志点圆心。1.当倾斜角较小时:倾斜角较小2.倾斜角较大时:倾斜角较大由上面两幅图可以看出…

阿里云ACM:云原生配置管理利器,让云上的Spring Cloud应用配置管理舞动起来

在传统架构中,如果配置信息有变更,通常是登陆服务器手动修改配置来使配置生效。在微服务架构中,应用数和节点数由于微服务化数量激增,导致发布次数增加,配置变更难度加大,通常是将应用配置抽象出来放置在外…

技术和商业的碰撞,谈阿里云与天猫双11这十年

2009年,发生了两件看似不起眼的事。 初春刚过,阿里云在北京一栋没有暖气的写字楼写下了飞天第一行代码。 同年11月11日,淘宝商城启动了一个叫做双11的促销活动。 谁也没想到,多年以后他们会是现在这模样。 前传 2007年淘宝的…

windows环境 wildfly-10.1.0.Final 安装、配置、部署

文章目录一、下载、解压、配置1. 下载Wildfly2. 解压,成功得到文件夹。3. 配置环境变量4. 添加管控台用户5. 启动并登录管控台测试6. 管控台页面简介7. 修改默认端口由于Wildfly是依赖与Java的Jdk的,所以在这之前要先安装JDK。一、下载、解压、配置 1. …

揭秘 | 双11逆天记录背后的数据库技术革新

每一个数字背后 都需要强大的技术支撑 Higher, Faster, Smarter 是我们不变的追求 技术无边界 创新无止境 ▽ 关于数据库的双11 也许你还想知道 ▽ 2135亿!2018 双11阿里数据库技术战报“双11”十年记 阿里数据库演绎变迁三部曲 原文链接 本文为云栖社区原创内容…

重磅!腾讯助推十亿级节点图计算进入分钟级时代;沈向洋离开微软;阿里:拥有超6000项已授权专利,涉及云、AI等领域……...

戳蓝字“CSDN云计算”关注我们哦! 嗨,大家好,重磅君带来的【云重磅】特别栏目,如期而至,每周五第一时间为大家带来重磅新闻。把握技术风向标,了解行业应用与实践,就交给我重磅君吧!重…

2135亿背后的双11项目协作怎么玩?

2018天猫双11已经收官,2135亿元的成交额再度刷新纪录,这是一场阿里巴巴经济体的深度协作。 在这个大协作项目中,项目协作难题难以想象:如何保证众多部门、百个核心产品、千个垂直项目、几千人的的高效协作?如何在双11…

下一代大数据处理引擎,阿里云实时计算独享模式重磅发布

11月14日,阿里云重磅发布了实时计算独享模式,即用户独享一部分物理资源,这部分资源在网络/磁盘/CPU/内存等资源上跟其他用户完全独立,是实时计算在原有共享模式基础上的重大升级。 独享模式优点更加突出 1、UDX开放:实…

刷爆了!李彦宏:这类程序员我给100万!你怎么看?

从2017年开始,人工智能便波澜不断,无论是从BAT高调布局AI,还是从年薪50万招聘AI应届生,炽手可热形容AI工程师一点都不过分。百度推出“少帅计划”,针对30岁以下的深度学习科学家,开出100万以上年薪!阿里巴巴…

Element-UI中Cascader 级联选择器使用

Element-UI的级联组件官方文档 <el-cascaderv-model"value":options"options":props"{ expandTrigger: hover }"change"handleChange"></el-cascader>说明&#xff1a; options:绑定数据源 props:数据配置项 v-model“val…

DRDS SQL 审计与分析——全面洞察 SQL 之利器

背景 数据库存储着系统的核心数据&#xff0c;其安全方面的问题在传统环境中已经成为泄漏和被篡改的重要根源。而在云端&#xff0c;数据库所面临的威胁被进一步的放大。因此&#xff0c;对云数据库的操作行为尤其是全量 SQL 执行记录的审计日志&#xff0c;就显得尤为重要&am…