Egg
本文仅用于学习记录,不存在任何商业用途,如侵删
由于上一步并没有成功实现,后面的内容笔者就大致看看了。
在上一步中我们拿到的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();
然后在模板中使用它。
{{ helper.relativeTime(item.time) }}
假设我们要禁止百度爬虫的访问。
聪明的开发者可能会很快猜到我们可以通过添加一个检查 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"
.
有关详细信息,请参阅中间件。
在编写业务逻辑时,我们不可避免地需要管理配置。
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;
单元测试非常重要,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
这就是全部,有关更多详细信息,请参阅单元测试。
上面这些短小节,我们只能触到Egg的冰山一角。然后去哪儿?阅读我们的文档以更好地理解框架。
上一篇:HTTP 请求是什么?