express ajax分页实例,Express后台实现数据分页功能

01995ef5ee02

问题:网站如果被大量用户使用时,服务器要完成大量发送数据和插入数据任务。

解决:为了保持服务的友好性,并保持合理的响应时间,在返回数据时,用分页功能来返回部分。经常使用的数据,可以使用内存来缓存,使其能快速发送(本文就不讨论了)。

本文内容如下:

抓取数据

保存数据

实现分页功能

不足之处

参考网站

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时,返回结果如下所示:

01995ef5ee02

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

5. 不足之处

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

6.参考网站

关注微信号:gh_93f4c7518be0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值