美文网首页
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后台实现数据分页功能

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