NestJS项目中如何正确接入使用node-deep-links深度链接库
NestJS 集成 node-deep-links 正确方案
直接在main.ts中调用原生实例的app.get注册路由不生效,核心是NestJS自身的路由系统优先级、全局前缀、全局中间件逻辑会拦截/覆盖你手动注册的原生路由,按下面的方式配置即可正常使用:
推荐实现(符合NestJS开发规范)
- 先确认依赖已安装:
npm install node-deep-links
- 在Controller层直接挂载deeplink处理逻辑,不要零散写在main.ts中:
import { Controller, Get, Req, Res } from '@nestjs/common'; import { deeplink } from 'node-deep-links'; import { Request, Response } from 'express'; // 若使用Fastify适配器,替换为fastify对应的Request、Response类型即可 @Controller() export class DeepLinkController { @Get('deeplink') triggerDeepLink(@Req() req: Request, @Res() res: Response) { // 直接透传请求响应给库提供的处理函数 return deeplink({ fallback: 'https://cupsapp.com', android_package_name: 'com.citylifeapps.cups', ios_store_link: 'https://itunes.apple.com/us/app/cups-unlimited-coffee/id556462755?mt=8&uo=4', })(req, res); } }
注意:使用@Res()注入原生响应对象后,NestJS会默认将该路由的响应处理权交还给业务代码,不会自动套用全局响应拦截器的结构包装逻辑,不会打断库自身的跳转响应逻辑。
必要配套配置
- 如果项目设置了全局路由前缀,需要在main.ts中排除deeplink路由,避免路径变成带前缀的地址:
import { RequestMethod } from '@nestjs/common'; // 设置全局前缀时添加排除规则 app.setGlobalPrefix('api', { exclude: [{ path: 'deeplink', method: RequestMethod.GET }] });
- 调试时不要直接用桌面端浏览器默认访问localhost测试,库的跳转逻辑依赖请求头的User-Agent判断客户端类型,本地测试可以用接口调试工具修改UA模拟安卓、iOS端请求,校验返回的跳转地址是否符合预期。
不推荐的main.ts直接注册方式
如果一定要在main.ts中直接注册路由,必须将注册代码放在await app.listen()启动逻辑之前,同时确保没有任何NestJS路由、全局中间件会匹配拦截/deeplink路径,这种方式和NestJS自身生命周期耦合度高,后续迭代容易出问题,不建议使用。
内容的提问来源于stack exchange,提问作者Ali Shame
相关产品推荐
相关产品推荐

