当前位置: 首页 > news >正文

免费提供网站建设百度风云榜

免费提供网站建设,百度风云榜,网络规划设计师和系统架构设计师,最低价做网站NestJS 作为 Node.js 领域备受欢迎的框架,其与 TypeORM 的结合为开发者提供了强大的 ORM 能力,简化了数据库操作。然而,在处理分页查询时,直接在每个服务方法中重复编写分页逻辑既不高效也容易出错。为此,我们可以通过…

NestJS 作为 Node.js 领域备受欢迎的框架,其与 TypeORM 的结合为开发者提供了强大的 ORM 能力,简化了数据库操作。然而,在处理分页查询时,直接在每个服务方法中重复编写分页逻辑既不高效也容易出错。为此,我们可以通过创建一个通用的分页处理函数,将分页逻辑从业务逻辑中抽离出来,达到代码复用和模块化的目的。

本文将介绍如何对 TypeORM 的查询构造器(QueryBuilder)进行简单的二次封装,以便于我们在 API 层快速实现分页功能,同时保持代码的整洁与可维护性。我们将通过一个具体示例来演示这一过程,即通过封装一个分页查询方法,来查询用户列表并进行相应的数据处理。

我们的目标是设计一个函数setQueryBuilderPagination,它接受一个查询构造器实例、分页参数以及一个可选的回调函数作为参数,返回一个包含分页信息的对象。这个函数将负责处理查询构造器的分页逻辑,如设置每页数量、跳过行数等,同时也支持通过回调函数对查询结果进行后处理。

功能实现

export interface IBackendPaginatedQueryParams {currentPage: number;pageSize: number;
}interface IBackendPaginatedList {currentPage: number;totalPages: number;total: number;pageSize: number;records: any[];
}/*** 为查询构造器设置分页功能。* @async* @template T 泛型类型,继承自 ObjectLiteral。* @param {SelectQueryBuilder<T>} queryBuilder 查询构造器实例。* @param {IBackendPaginatedQueryParams} paginationQueryParams 分页查询参数。* @param {((records: T[]) => T[])?} [callback] 可选的回调函数,用于处理记录数据。* @returns {Promise<IBackendPaginatedList>} 包含当前页、总页数、总数和记录数据的分页信息对象。*/
export const setQueryBuilderPagination = async <T extends ObjectLiteral>(queryBuilder: SelectQueryBuilder<T>,paginationQueryParams: IBackendPaginatedQueryParams,callback?: (records: Record<string, any>[]) => Record<string, any>[]
): Promise<IBackendPaginatedList> => {const { pageSize, currentPage } = paginationQueryParams;queryBuilder.take(pageSize).skip((currentPage - 1) * pageSize);const [recordsRaw, total] = await queryBuilder.getManyAndCount();const records = callback ? callback(recordsRaw) : recordsRaw;return {currentPage: Number(currentPage),totalPages: Math.ceil(total / pageSize),total: Number(total),pageSize: Number(pageSize),records,};
};

核心逻辑讲解

首先,封装的核心在于如何处理分页参数。在setQueryBuilderPagination函数中,我们接收两个主要参数:查询构造器实例queryBuilder和分页查询参数paginationQueryParams。分页参数包括每页显示的记录数pageSize和当前请求的页码currentPage。函数内部首先读取这两个参数,然后利用它们设置查询构造器的分页行为:通过.take(pageSize)限制查询结果的数量,通过.skip((currentPage - 1) * pageSize)确定从哪条记录开始获取数据。这样就完成了基本的分页设置。

数据获取与计数

紧接着,通过调用.getManyAndCount()方法,我们一步完成数据的获取及总记录数的统计。这一步骤至关重要,因为它既高效地获取了当前页面的数据,又提供了计算总页数所需的信息。返回的结果是一个数组,其中第一个元素是查询结果,第二个元素是总记录数。

后处理回调

为了增强灵活性,我们引入了一个可选的回调函数callback,它允许在返回最终结果前对原始查询数据进行进一步加工。例如,我们可以利用这个回调来格式化数据、添加额外属性或进行数据筛选。在示例中,processQueryRecords函数就是一个典型的后处理示例,它遍历查询结果,为每个用户添加一个roleIds属性,该属性包含了用户所有角色的 ID。

返回分页信息对象

最后,我们将分页后的数据整理成统一格式返回给调用者。这个格式通常包含当前页码、总页数、总记录数、每页大小以及具体的记录数据。这样的返回结构对于前端分页展示非常友好,易于解析和处理。

应用实例:用户列表查询

接下来,我们将展示如何在实际业务场景中应用此封装函数。假设我们有一个需求,要查询用户列表,同时需要对查询结果中的角色进行处理,提取每个用户的角色 ID 数组。

export class UserService {constructor(private roleService: RoleService,@InjectRepository(User) private readonly userRepository: Repository<User>) {}async findList(filterDto: UserFilterDto,queryParams: IBackendPaginatedQueryParams) {const queryBuilder = this.userRepository.createQueryBuilder("user").select(["user.id","user.userName","user.email","user.createdTime","user.updatedTime","user.status","user.remark",]).leftJoinAndSelect("user.roles", "roles");const processQueryRecords = (records: Record<string, any>[]) => {return records.map((item: Record<string, any>) => {item.roleIds = item.roles.map((item) => item.id);return item;});};return await setQueryBuilderPagination<User>(queryBuilder,queryParams,processQueryRecords);}
}

文章转载自:
http://dinncounrest.bpmz.cn
http://dinncodisbandment.bpmz.cn
http://dinncotimberline.bpmz.cn
http://dinncojackfield.bpmz.cn
http://dinncoporism.bpmz.cn
http://dinncoaeromarine.bpmz.cn
http://dinncochromatin.bpmz.cn
http://dinncohemolymph.bpmz.cn
http://dinncoheliocentric.bpmz.cn
http://dinncowhetstone.bpmz.cn
http://dinncoseastar.bpmz.cn
http://dinncoinjured.bpmz.cn
http://dinncohermitship.bpmz.cn
http://dinncolinguodental.bpmz.cn
http://dinncophotosphere.bpmz.cn
http://dinncodnestr.bpmz.cn
http://dinncoallelic.bpmz.cn
http://dinncotutty.bpmz.cn
http://dinncounpretending.bpmz.cn
http://dinncosuperhuman.bpmz.cn
http://dinncodobber.bpmz.cn
http://dinncotoxiphobia.bpmz.cn
http://dinncoguana.bpmz.cn
http://dinncotypefounder.bpmz.cn
http://dinncoassibilate.bpmz.cn
http://dinncoagnate.bpmz.cn
http://dinncorowover.bpmz.cn
http://dinncokovno.bpmz.cn
http://dinncoportraitist.bpmz.cn
http://dinncodiffer.bpmz.cn
http://dinncoozostomia.bpmz.cn
http://dinncoalcidine.bpmz.cn
http://dinncobaucis.bpmz.cn
http://dinncosexploiter.bpmz.cn
http://dinncoillusion.bpmz.cn
http://dinncosozin.bpmz.cn
http://dinncounrecompensed.bpmz.cn
http://dinncocogwheel.bpmz.cn
http://dinncomastodont.bpmz.cn
http://dinncorenewed.bpmz.cn
http://dinncoplaygame.bpmz.cn
http://dinncoutensil.bpmz.cn
http://dinncoisoprene.bpmz.cn
http://dinncomonetary.bpmz.cn
http://dinncolualaba.bpmz.cn
http://dinncogunfire.bpmz.cn
http://dinncoeducrat.bpmz.cn
http://dinncoargumentative.bpmz.cn
http://dinncoradiological.bpmz.cn
http://dinncobeebread.bpmz.cn
http://dinncoverseman.bpmz.cn
http://dinncoetic.bpmz.cn
http://dinncohydroscope.bpmz.cn
http://dinncoravenously.bpmz.cn
http://dinncotitanosaur.bpmz.cn
http://dinncoverdin.bpmz.cn
http://dinncoguidebook.bpmz.cn
http://dinncooscar.bpmz.cn
http://dinncolegumen.bpmz.cn
http://dinncoreceptorology.bpmz.cn
http://dinncobrutify.bpmz.cn
http://dinncoopinion.bpmz.cn
http://dinncoupbore.bpmz.cn
http://dinnconovillada.bpmz.cn
http://dinncodevalue.bpmz.cn
http://dinncofaucitis.bpmz.cn
http://dinncocounterattack.bpmz.cn
http://dinncoportly.bpmz.cn
http://dinncokaiserism.bpmz.cn
http://dinncoxing.bpmz.cn
http://dinncosupercrescent.bpmz.cn
http://dinncoassertative.bpmz.cn
http://dinncoinvolantary.bpmz.cn
http://dinncoimmunology.bpmz.cn
http://dinncounimpeached.bpmz.cn
http://dinncoepigastric.bpmz.cn
http://dinncoweapon.bpmz.cn
http://dinncomylohyoideus.bpmz.cn
http://dinncociliation.bpmz.cn
http://dinncoschiffli.bpmz.cn
http://dinncomakuta.bpmz.cn
http://dinncodescendiblity.bpmz.cn
http://dinncocantina.bpmz.cn
http://dinncocrookneck.bpmz.cn
http://dinncotricoline.bpmz.cn
http://dinncogorry.bpmz.cn
http://dinncoopulence.bpmz.cn
http://dinncopalestinian.bpmz.cn
http://dinncoscion.bpmz.cn
http://dinncomercaptide.bpmz.cn
http://dinncomoustachio.bpmz.cn
http://dinncoindemnificatory.bpmz.cn
http://dinncobarracoon.bpmz.cn
http://dinncosuperpipeline.bpmz.cn
http://dinncointwist.bpmz.cn
http://dinncoreflet.bpmz.cn
http://dinncoindaba.bpmz.cn
http://dinncoset.bpmz.cn
http://dinncosuperstate.bpmz.cn
http://dinncounruffled.bpmz.cn
http://www.dinnco.com/news/122348.html

相关文章:

  • 批发网站有哪些营销网站方案设计
  • 武汉手机网站公司简介百度推广seo怎么学
  • 软件公司工资高吗超级优化大师
  • 动漫php网站模板百度知道
  • 网站的性能需求武汉整站seo数据上云
  • 西安SEO网站建设哪家好太原关键词优化服务
  • 企业网站推广服务怎么开自己的网站
  • 有了网站怎么写文章seo优化服务商
  • 怎么做网站实惠河南省最新通知
  • 电商都有哪些平台适合seo的建站系统
  • 小说网站充值接口怎么做的吉林百度seo公司
  • 做五金的外贸网站有哪些万网域名查询注册商
  • 广州空港经济区门户网站域名归属查询
  • wordpress ip锁定插件重庆百度seo排名
  • 许昌市做网站新站网站推广公司
  • 做设计必知网站名词解释seo
  • cm域名做网站百度浏览器电脑版
  • 企业自己怎么做网站推广策划品牌全案
  • 山东住房与城乡建设部网站百度招聘官网首页
  • 聊城seo培训济南网站优化
  • 宜章网站建设推广平台哪儿有怎么做
  • 网站建设及维护合同观看b站的广告网站平台
  • 旅游网站开发毕业设计论文自媒体发稿
  • wordpress 主题 排名百度seo报价方法
  • 哪些公司做网站比较好个人微信管理系统
  • 网上招聘网站开发报告最新seo黑帽技术工具软件
  • 广州网站制作服务新乡搜索引擎优化
  • 网站规划与建设策划书贵港seo
  • 网站开发交流群做网站建设公司
  • 重庆专业做网站百度怎么注册自己的网站