美文网首页
Express后台实现数据分页功能

Express后台实现数据分页功能

作者: jebirth | 来源:发表于2018-01-29 07:31 被阅读0次

问题:网站如果被大量用户使用时,服务器要完成大量发送数据和插入数据任务。
解决:为了保持服务的友好性,并保持合理的响应时间,在返回数据时,用分页功能来返回部分。经常使用的数据,可以使用内存来缓存,使其能快速发送(本文就不讨论了)。

本文内容如下:
  • 抓取数据
  • 保存数据
  • 实现分页功能
  • 不足之处
  • 参考网站
1.抓取数据
  • 安装Python2.7和Scrapy。目前Scrapy对2.*版本支持比较好。
  • 创建一个posts项目。运行:
    scrapy startproject posts
  • 设置posts/items.py。设置需要显示系统信息,网站信息和抓取信息的字段列表,如下所示(代码不全):
    # Primary fields
    title = Field()
    view = Field()
    updated = Field()
    image_urls = Field()
    link = Field()

    # Calculated fields
    images = Field()
    location = Field()

    # Housekeeping fields
    url = Field()
    project = Field()
    spider = Field()
    server = Field()
    date = Field()
  • 使用CrawlSpider类进行双向抓取。运行:
    scrapy genspider -t crawl easy web
    然后修改spiders/easy.py,如下所示(设置双向抓取):
rules = (
        Rule(LinkExtractor(restrict_xpaths='//a[contains(@class, "buttonright")]')),
        Rule(LinkExtractor(restrict_xpaths='//a[contains(@class, "result_link")]'), callback='parse_item')
    )
  • 抓取数据。在终端中,运行:
    scrapy crawl easy -s CLOSESPIDER_ITEMCOUNT=50 -o item.json
    //向网站抓取50条数据,并保存到item.json文件中
2.保存数据
  • 读取item.json数据。在根目录创建contacts.js,并添加如下内容:
import fs from "fs";
const Data = JSON.parse(fs.readFileSync("./posts/items.json"));

//筛选数据
const posts = Data.map((post) => {
    if(post.hasOwnProperty("updated")){
        return Object.assign({}, {
            title: post.title[0],
            link: post.url[0],
            view: post.view[0],
            updated: post.updated[0]
        })
    }else{
        return {}
    } 
});

//去掉{},抓取的数据保存到postsData中
const postsData = posts.filter((value) => {
    return Object.keys(value).length
})
  • 创建一个posts数据库。在根目录中创建index.js,并添加如下所示:
const postsSchema = new mongoose.Schema({
  title: { type: String },
  link: { type: String },
  view: { type: String },
  updated: { type: String }
});
const Posts = mongoose.model("Post", postsSchema);
  • 将数据保存到数据库中
postsData.map(value => {
  let item = new Posts(value);
  item.save((error, result) => {
    if (error) {
      throw error;
    }
  });
});
3.实现分页功能
  • 安装依赖包。运行:
    cnpm install express-paginate mongoose-paginate --save
  • 设置返回页数值。下面代码中:10表示默认返回10条数据,50表示最大返回条数不会超过50条
app.use(expressPaginate.middleware(10, 50));
  • 在创建数据库Model时,将mongoose-pagination插件提供给postsSchema,如下所示:
postsSchema.plugin(mongoosePaginate);
const Posts = mongoose.model("Post", postsSchema);
  • 获取数据。调用paginate()函数以分页的方式获取请求的条目:
Posts.paginate(
      {},
      {
        page: req.query.page,
        limit: req.query.limit
      },
      (error, result) => {
        if (error) {
          res.writeHead(500, { "Content-Type": "text/plain" });
          res.end("Internal server error");
          return;
        }
        res.setHeader("Content-Type", "application/json");
        res.send({
          object: "contacts",
          page_count: result.pages,
          result: result
        });
      }
    );
  • 测试结果。如果每页返回10条数据,并想获取到第2页的数据。在地址栏中输入localhost:8080/api?limit=10&page=2时,返回结果如下所示:

  • 代码分享。点击这里查看和下载代码。

5. 不足之处

要先转换在Posts项目中,抓取数据保存到item.json中,才运行服务器。鄙人不才,不知在Package.json如何实现。

6.参考网站

关注微信号:gh_93f4c7518be0

相关文章

  • Express后台实现数据分页功能

    问题:网站如果被大量用户使用时,服务器要完成大量发送数据和插入数据任务。解决:为了保持服务的友好性,并保持合理的响...

  • flask实现分页

    原文地址数据库实现分页offset:使用offset可以实现数据库分页功能questions = Question...

  • (14)Django - 分页功能

    Django已为开发者内置了分页功能,只需调用Django内置分页功能的函数即可实现数据分页功能。我们在Djang...

  • vue使用分页

    vue2.0结合element-ui实现分页功能 大体结构 方法有两种,第一种是处理后台传过来的总数据,不需要后台...

  • 分页组件的简单实现(初稿)

    分页功能是后台管理系统中很常见的一个功能,今天我们就来看下如何实现一个简单的分页组件。 初步实现 首先从最简单的情...

  • 第一次使用mongoDB的记录

    简介 实现一个 vue+express+mongodb 的小demo,包含了列表的增删查,以及简单的分页功能。Gi...

  • SwipeRefreshLayout内Recyclerview刷

    功能要求:分页加载网络数据,实现上拉下拉功能错误日志:java.lang.IndexOutOfBoundsExce...

  • Flask 构建微电影视频网站(4.1)

    后台管理 实现后台管理系统使用flask sqlalchemy结合mysql数据库进行增删改查操作、分页的使用、路...

  • MySQL查询细节回顾

    前端通常在请求数据时会用到分页,PHP后台实现基本分页源码如下: 子查询作为数据源(from子句),必须给其设定一...

  • vue+element实现前端逻辑分页及前端搜索功能

    后端一次获取数据前端分页 bug:vue和element实现的后台分页,当前是第二页,点击搜索,强制设置curre...

网友评论

      本文标题:Express后台实现数据分页功能

      本文链接:https://www.haomeiwen.com/subject/yjmtzxtx.html