Angular父路由Resolver报错:At least one route resolver didn't emit any value
结合你描述的导航失败场景(触发NavigationCancel且Resolver未发出值),以下是路由配置层面可能的问题点:
路由匹配优先级冲突
检查未授权路由组(登录页)和授权父路由的配置顺序。如果登录页的路由规则(比如空路径'')定义在授权父路由之前,认证后偶尔会出现路由匹配逻辑优先命中登录页路由的情况——此时虽然你已处于登录状态,unauthGuard会尝试拦截并跳转,但这个过程可能打断授权父路由上referentialDataInitResolver的执行,最终导致导航因Resolver未输出值而被取消。守卫与Resolver的执行顺序/状态同步问题
尽管测试显示authGuard工作正常,但需确认守卫的异步逻辑是否在Resolver启动前完全完成并同步状态。比如authGuard返回的Observable如果在认证状态(如token)未完全写入全局状态时就提前complete,Resolver发起请求时可能拿不到有效授权信息,导致请求被拦截或根本无法发出,forkJoin因无Observable完成而始终不输出值,触发NavigationCancel。Resolver的模块注入范围错误
若referentialDataInitResolver是在懒加载模块中声明提供,但授权父路由属于根模块路由配置,可能出现Resolver实例化失败的情况——此时Resolver无法正常执行,自然不会输出值,导致导航被取消。需确保Resolver在根模块或授权路由所属的共享模块中正确提供。授权父路由的懒加载配置冲突
如果授权页面组采用懒加载,检查referentialDataInitResolver是否挂载在懒加载路由的父节点上。第一次导航时,懒加载模块的加载过程可能阻塞Resolver的执行,导致Resolver超时或无法正常发起请求;或者懒加载模块内部的路由配置覆盖了父路由的Resolver,导致Resolver未被触发。重复导航触发导致的Resolver中断
检查登录成功后的导航逻辑,是否存在多次调用navigate的情况。重复导航会终止前一次未完成的导航流程,此时已启动的Resolver会被中断,后续导航可能因状态不一致(如Resolver未完成初始化)而失败,表现为停留在登录页且导航栏操作失效。路由上下文传递问题
Resolver发起请求时,依赖的全局状态(如token)可能未通过路由上下文正确传递。比如拦截器获取token的逻辑依赖路由守卫更新的状态,但路由上下文未及时同步,导致请求头中无有效授权信息,请求被后端拦截或处于pending状态,forkJoin无法输出结果,Resolver无返回值触发导航取消。
内容的提问来源于stack exchange,提问作者Jules Charlet

