Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | 3x 9x 3x | 'use strict' function paginate(query, options, callback) { query = query || {}; options = Object.assign({}, paginate.options, options); options.limit = Number(options.limit) > 0 ? Number(options.limit) : 10 // 默认10 let sortBy = String(options.sortBy || 'updatedAt') // 默认updatedAt options.sort = Number(options.sort || -1) > 0 ? sortBy : '-' + sortBy // 默认+updatedAt(倒序) options.lean = options.lean || false; let leanWithId = options.leanWithId ? options.leanWithId : true; let promises; if (options.offset) { options.offset = options.offset; options.skip = options.offset; } else if (options.page) { options.page = options.page; options.skip = (options.page - 1) * options.limit; } else { options.page = 1; options.offset = 0; options.skip = options.offset; } if (options.limit) { let docsQuery = this.find(query) .select(options.select) .sort(options.sort) .skip(options.skip) .limit(options.limit) .lean(options.lean); if (options.populate) { [].concat(options.populate).forEach((item) => { docsQuery.populate(item); }); } promises = { docs: docsQuery.exec(), count: this.count(query).exec(), }; if (options.lean && leanWithId) { promises.docs = promises.docs.then((docs) => { docs.forEach((doc) => { doc.id = String(doc._id); }); return docs; }); } } promises = Object.keys(promises).map((x) => promises[x]); return Promise.all(promises).then((data) => { let result = { list: data[0], count: data[1], limit: options.limit, }; if (options.offset !== undefined) { result.offset = options.offset; } if (options.page !== undefined) { result.page = options.page; result.pages = Math.ceil(result.count / options.limit) || 1; } if (typeof callback === 'function') { return callback(null, result); } return new Promise((resolve, reject) => { resolve(result); }); }); } /** * @param {Schema} schema */ module.exports = function (schema) { schema.statics.paginate = paginate; }; module.exports.paginate = paginate; |