• Egg 1. 快速开始 Quick Start 1.3 一步步 Step by Step 1.3.5 创建服务


    Egg

    Egg

    本文仅用于学习记录,不存在任何商业用途,如侵删

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    在这里插入图片描述

    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;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    在这里插入图片描述

    并添加配置

    exports.news = {
        pageSize: 5,
        serverUrl: 'https://hacker-news.firebaseio.com/v0',
    }
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    重启服务,运行访问:

    在这里插入图片描述

    这里看到,一页是有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,到此为止。跳过【这个小结的主要目的还是为了演示怎么写一个服务】

  • 相关阅读:
    59页数字乡镇综合解决方案
    抓住晨会驱动【目标管理】
    自恢复集群启动命令oninitdb的设计与实现:
    STM32移植LVGL8.2
    关系型数据库的一些概念
    Elasticsearch之文本搜索(十三)
    SwiftUI Swift 5.7 新功能大全,告诉什么时候Swift直接调用C++
    天眼查最新方式工商信息爬取(公开信息)
    论区块链应用开发中的技术选型
    文档在线预览(五)在服务器部署组件来实现在线预览
  • 原文地址:https://blog.csdn.net/weixin_44226181/article/details/128157411