I am trying to paginate using Node.js and Express and I want if the slug <= 0, slug = 1.
new(req, res, next) {
let perPage = 16;
//let page = req.params.page <= 0 ? 1: req.params.page; //This work
let page = req.params.page || 1; //BUT this NOT work, please explain for me
Product
.find()
.skip((perPage * (page - 1)))
.limit(perPage)
.exec((err, products) => {
Product.countDocuments((err, count) => {
if (err) return next(err);
res.render('product/index_product', {
products,
current: page,
pages: Math.ceil(count / perPage)
});
});
});
}
I used the || operator to solve it but it does not work, I don't know why.
CodePudding user response:
In the case of the page being 0, query string parameters are parsed as strings.
req.params.page <= 0 ? 1 works because '0' is, lexiographically, indeed <= 0 (when then 0 on the right gets implicitly coerced to '0').
console.log('0' <= 0);
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>
But '0' is not falsey, so
let page = req.params.page || 1;
is
let page = '0' || 1;
let page = '0'
Convert the page to a number first.
const paramPage = Number(req.params.page);
const page = paramPage || 1;
In the case of the page being negative, let page = req.params.page || 1 wouldn't make sense anyway - negative numbers are truthy too. If that's a possibility in your code, your original approach of
const page = req.params.page <= 0 ? 1:
is the best one there is.
