Egg
Egg
本文仅用于学习记录,不存在任何商业用途,如侵删
文章目录
- Egg
- 1. 快速开始 Quick Start
- 1.3 一步步 Step by Step
- 1.3.5 创建服务
- Hacker News API
1. 快速开始 Quick Start
1.3 一步步 Step by Step
1.3.5 创建服务
在实际开发中,控制器通常不会自己生成数据,也不会包含复杂的业务逻辑。复杂的业务逻辑应该抽象为业务逻辑层,即服务。
现在让我们创建一个服务来从HackerNews获取数据。
Hacker News API
https://github.com/HackerNews/API
const {keys} = require("../../config/config.default");
const Service = require('egg').Service;
class NewService extends Service {
async list(page = 1) {
const {serverUrl, pageSize} = this.config.news;
const {data: idList} = await this.ctx.curl(
`${serverUrl}/topstories.json`,
{
data: {
orderBy: '"$key"',
startAt: `"${pageSize * (page - 1)}"`,
endAt: `"${pageSize * page - 1}"`,
},
dataType: 'json',
},
);
const newsList = await Promise.all(
Object.keys(idList).map((key) => {
const url = `${serverUrl}/item/${idList[key]}.json`;
return this.ctx.curl(url,{dataType:'json'});
}),
);
return newsList.map((res) => {res.data});
}
}
module.exports = NewService;
Egg内置了HttpClient以帮助您发出 HTTP 请求。
然后稍微修改我们之前的控制器。
const Controller = require('egg').Controller;
class NewsController extends Controller {
async list() {
const ctx = this.ctx;
const page = ctx.query.page || 1;
const newsList = await ctx.service.news.list(page);
await ctx.render('news/list.tpl', {list: newsList});
}
}
module.exports = NewsController;
并添加配置
exports.news = {
pageSize: 5,
serverUrl: 'https://hacker-news.firebaseio.com/v0',
}
重启服务,运行访问:
这里看到,一页是有5条,但是并没有数据进行展示
笔者点进去了那个网址,发现并没有东西,没有东西显示就不奇怪了,
毕竟是非常古老的东西了,谷歌一下有没有可用的接口
笔者找了一会儿,看到一个https://hacker-news.firebaseio.com/v0/topstories.json
我寻思这个地址和我项目中的是一样的。
我找到了官方仓库中的一个回复
OK,让我试试【感觉就是终端可以xx,但是咱们编写的应用不可以实现自动xx】
笔者按照代码的意思其实可以拿到数据,https://hacker-news.firebaseio.com/v0/item/33136554.json
但是要怎么才能实现应用也可以自己去拿到数据
开始谷歌
【超出笔者的知识范畴了…】
强制curlxxx
算了算了,有点子复杂,而且好像不太好。【这种就没有国内的镜像啥的…就很…】
我想到个办法,把所有json都下载下来,统一放到一个正常的URL
说搞就搞。他那个baseurl是固定的,我直接换成我的,起一个服务,开一个新端口,不要域名就好了,先弄个20条
先把这个下载下来
我直接放在这里,egg自己集成了静态资源,试试
噗,我真是个鬼才。
接下来就先下几个个【就前面几个吧,有数据能取到就行】
我真是个人才
试试
再试一次
好家伙,直接500了
莫非不能同一个地址相互访问?
我把这些文件传到了GitHub
再试一次
这次又200了,我晕
感觉也不是报错了,这个地址好像返回的是一个页面
笔者又搜了一下,如何直接获取GitHub上的json文件
但是好像Gitee更简单些
推上去了
OK。
最后再试一次
这…
我又看了下,模板页面
很多东西我们压根儿没有
然后官方样例工程,和文档写的也对不上…
OK,到此为止。跳过【这个小结的主要目的还是为了演示怎么写一个服务】