Egg
Egg
本文仅用于学习记录,不存在任何商业用途,如侵删
文章目录
- Egg
- 1. 快速开始 Quick Start
- 1.3 一步步 Step by Step
- 1.3.6 添加扩展
- 1.3.7 添加中间件
- 1.3.8 添加配置
- 1.3.9 添加单元测试
- 1.4 结论
1. 快速开始 Quick Start
1.3 一步步 Step by Step
1.3.6 添加扩展
由于上一步并没有成功实现,后面的内容笔者就大致看看了。
在上一步中我们拿到的json数据中,time 是一个时间戳格式的,
很明显,这样不太友好。
Egg 为我们提供了一种快速扩展其功能的方法。我们只需要将扩展脚本添加到app/extend
目录中。
有关更多信息,请参阅。扩展名。
在视图的情况下,我们可以只写一个助手作为扩展。
$ npm i moment --save
// app/extend/helper.js
const moment = require('moment');
exports.relativeTime = (time) => moment(new Date(time * 1000)).fromNow();
然后在模板中使用它。
<!-- app/view/news/list.tpl -->
{{ helper.relativeTime(item.time) }}
1.3.7 添加中间件
假设我们要禁止百度爬虫的访问。
聪明的开发者可能会很快猜到我们可以通过添加一个检查 User-Agent的中间件来实现它。
// app/middleware/robot.js
// options === app.config.robot
module.exports = (options, app) => {
return async function robotMiddleware(ctx, next) {
const source = ctx.get('user-agent') || '';
const match = options.ua.some((ua) => ua.test(source));
if (match) {
ctx.status = 403;
ctx.message = 'Go away, robot.';
} else {
await next();
}
};
};
// config/config.default.js
// add middleware robot
exports.middleware = ['robot'];
// robot's configurations
exports.robot = {
ua: [/Baiduspider/i],
};
现在尝试使用curl localhost:7001/news -A "Baiduspider"
.
有关详细信息,请参阅中间件。
1.3.8 添加配置
在编写业务逻辑时,我们不可避免地需要管理配置。
Egg 提供了一种强大的方法来在合并的配置文件中管理它们。
-
环境特定的配置文件得到很好的支持,例如 config.local.js、config.prod.js 等。
-
可以在任何方便应用程序/插件/框架的地方设置配置,Egg 会小心地合并和加载它们。
-
有关合并的更多信息,请参阅配置。
// config/config.default.js
exports.robot = {
ua: [/curl/i, /Baiduspider/i],
};
// config/config.local.js
// only read at development mode, will override default
exports.robot = {
ua: [/Baiduspider/i],
};
// app/service/some.js
const Service = require('egg').Service;
class SomeService extends Service {
async list() {
const rule = this.config.robot.ua;
}
}
module.exports = SomeService;
1.3.9 添加单元测试
单元测试非常重要,Egg 还提供了egg-bin来帮助你轻松编写测试。
所有的测试文件都应该放在{app_root}/test/**/*.test.js
.
// test/app/middleware/robot.test.js
const { app, mock, assert } = require('egg-mock/bootstrap');
describe('test/app/middleware/robot.test.js', () => {
it('should block robot', () => {
return app
.httpRequest()
.get('/')
.set('User-Agent', 'Baiduspider')
.expect(403);
});
});
然后添加npm scripts
.
{
"scripts": {
"test": "egg-bin test",
"cov": "egg-bin cov"
}
}
还要安装依赖项:
$ npm i egg-mock --save-dev
运行。
$ npm test
这就是全部,有关更多详细信息,请参阅单元测试。
1.4 结论
上面这些短小节,我们只能触到Egg的冰山一角。然后去哪儿?阅读我们的文档以更好地理解框架。
- 关于 Egg 样板类型,请参见样板类型说明。
- Egg 为扩展功能提供了强大的机制。请参阅插件。
- Egg 框架允许小型或大型团队在有据可查的约定和编码最佳实践下尽可能快地一起工作。此外,团队可以在框架之上构建逻辑,以更好地满足他们的特殊需求。在 [Frameworks] 上查看更多信息。(…/advanced/framework.md)。
- Egg 框架提供代码可重用性和模块化。请参阅Progressive的详细信息。
- Egg 框架使开发人员能够使用许多插件和社区驱动的工具编写无痛的单元测试。团队应该尝试使用 Egg 单元测试,而不用担心设置测试工具,而是编写测试逻辑。请参阅单元测试。