NodeJS 顺序分页

goqiplq2  于 2023-03-01  发布在  Node.js
关注(0)|答案(8)|浏览(282)

在我的nodejs网络应用程序上使用sequelize,我想使用分页(按日期)查询帖子。阅读sequelize文档,他们提供使用offsetlimit
由于我想从新到旧显示帖子,我需要考虑它们创建的日期。例如,如果我限制第一个查询为10页,并且在执行第二个查询之前创建了一个新帖子,则偏移量为10的下一个查询将导致与上一个查询重复的帖子。
我应该如何实现分页,以便它将支持新的条目?

qnakjoqk

qnakjoqk1#

最简单的方法是使用Sequelize的findAndCountAll

Post.findAndCountAll({
    where: {...},
    order: [...],
    limit: 5,
    offset: 0,
}).then(function (result) {
    res.render(...);
});

在这里,result包含查询结果和计数result.rowsresult.count,然后可以增加偏移量并使用它进行分页。
findAndCountAll的后续文档

ehxuflar

ehxuflar2#

试试这个:

const paginate = (query, { page, pageSize }) => {
  const offset = page * pageSize;
  const limit = pageSize;

  return {
    ...query,
    offset,
    limit,
  };
};

model.findAll(
  paginate(
    {
      where: {}, // conditions
    },
    { page, pageSize },
  ),
);

为了避免样板代码

t1qtbnec

t1qtbnec3#

如果您希望有一个稳定的分页,不要在行偏移量上分页,因为它是不稳定的,正如您提到的原因。
你应该使用一个稳定的值来分页,并使用where子句来过滤结果,最好的情况是你有一个自动递增的id,但是发布日期也可以是合理的。
比如:

Post.findAll({
  where: {
    createdDate: {
      $lt: previousDate,
    },
  },
  limit: 10,
});

您需要跟踪此ofc的previousDate。此方法也有一些注意事项,您可能需要将其与客户端重复数据消除结合使用。
下面是一篇博客文章,可能有你需要的所有答案:Pagination: You're (Probably) Doing It Wrong

jdzmm42g

jdzmm42g4#

对于findAndCountAll,此处的计数对于分页非常有用,我们可以根据需要限制总计数,也可以使用异步和等待

let resAccidents = await ModalName.findAndCountAll({
  where: { createdByID: employeeID },
  offset: 0,
  limit: 10,
});

这将根据where条件返回总记录数和它的前10个记录,然后增加offset的值以获取更多记录。

9w11ddsr

9w11ddsr5#

你可以简单地这样做

let limit = 10;
let offset = 0 + (req.body.page - 1) * limit;
Posts.findAndCountAll({
  offset: offset,
  limit: limit,
  order: [["date", "ASC"]],
})
  .then(async (result) => {
    return res.status(200).json({
      status: true,
      message: res.__("success"),
      innerData: result,
    });
  })
  .catch((err) => {
    return validator.InvalidResponse(res, `${err}`);
  });
j2qf4p5b

j2qf4p5b6#

试试这个:

db.findAll({
   offset: page_no,// your page number
      limit:25,// your limit
wnvonmuf

wnvonmuf7#

这个解决了我的问题。

export const paginate = (query, schema) => {
  let page = query.page ? query.page - 1 : 0;
  page = page < 0 ? 0 : page;
  let limit = parseInt(query.limit || 10);
  limit = limit < 0 ? 10 : limit;
  const offset = page * limit;
  const where = {};
  delete query.page;
  delete query.limit;
  Object.keys(schema).forEach((key) => {
    schema[key] && query[key] ? (where[key] = query[key]) : null;
  });
  return {
    where: where,
    offset,
    limit,
  };
};

@Get()
findAll(@Query() query): unknown {
  return this.model.findAll(paginate(query, {xx:1}));
}

/型号?xx=yy页码= 1限值=5

ux6nzvsh

ux6nzvsh8#

var defered = Q.defer();
const offset = queryString.offset * queryString.limit;
const limit = queryString.limit;
var queryWhere = { class_id: { $ne: null }, section_id: { $ne: null } };
var searchClass = {};
var searchSection = {};
if (queryString) {
    if (queryString.class && queryString.class !== "") {
       searchClass = { class_id: { $eq: queryString.class } };
    } else if (queryString.class && queryString.class === "") {
       searchClass = { class_id: { $ne: null } };
    }

if (queryString.section && queryString.section !== "") {
      searchSection = { section_id: { $eq: queryString.section } };
} else if (queryString.section && queryString.section === "") {
      searchSection = { section_id: { $ne: null } };
}
}

queryWhere = {
    $and: [[searchClass], [searchSection]]
};
const schoolDB = require("../../db/models/tenant")(schema);
const Student = schoolDB.model("Student");
Student.findAll({
   attributes: [
  "id",
  "first_name",
  "last_name",
  "profile_image_url",
  "roll_number",
  "emergency_contact_number"
],
offset: offset,
limit: limit,
where: queryWhere,
order: [["roll_number", "ASC"]]
})
.then(result => {
  defered.resolve(result);
})
.catch(err => {
  defered.reject(err);
});
Recommended using Sequelize's own operators
var defered = Q.defer();
const offset = queryString.offset * queryString.limit;
const limit = queryString.limit;
var queryWhere = { class_id: { $ne: null }, section_id: { $ne: null } };
var searchClass = {};
var searchSection = {};
if (queryString) {
    if (queryString.class && queryString.class !== "") {
       searchClass = { class_id: { $eq: queryString.class } };
    } else if (queryString.class && queryString.class === "") {
       searchClass = { class_id: { $ne: null } };
    }

if (queryString.section && queryString.section !== "") {
      searchSection = { section_id: { $eq: queryString.section } };
} else if (queryString.section && queryString.section === "") {
      searchSection = { section_id: { $ne: null } };
}
}

queryWhere = {
    $and: [[searchClass], [searchSection]]
};
const schoolDB = require("../../db/models/tenant")(schema);
const Student = schoolDB.model("Student");
Student.findAll({
   attributes: [
  "id",
  "first_name",
  "last_name",
  "profile_image_url",
  "roll_number",
  "emergency_contact_number"
],
offset: offset,
limit: limit,
where: queryWhere,
order: [["roll_number", "ASC"]]
})
.then(result => {
  defered.resolve(result);
})
.catch(err => {
  defered.reject(err);
});

相关问题