从Angular 5迁移到Angular 6遇TypeError错误求助
Angular 6迁移后Apollo watchQuery报错的排查思路
我注意到你把代码从Angular 5迁移到Angular 6后,遇到了Apollo相关的报错,具体错误信息如下:
ERROR Error: Uncaught (in promise): TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. TypeError: You provided an invalid object where a stream was expected. You can provide an Observable, Promise, Array, or Iterable. at subscribeTo (subscribeTo.js:41) at from (from.js:17) at new QueryRef (QueryRef.js:6) at Apollo.push../node_modules/apollo-angular/Apollo.js.ApolloBase.watchQuery (Apollo.js:29) at contacts.service.ts:75
结合Angular版本升级的特性和Apollo的常见问题,我整理了几个可能导致这个错误的原因:
- apollo-angular与Angular 6的版本兼容性问题:Angular 6默认搭配RxJS 6,而RxJS 6在API上有较大改动(比如操作符的导入和使用方式)。如果你的
apollo-angular还是适配Angular 5/RxJS 5的旧版本,就会因为内部调用RxJS的方式不兼容,导致返回的对象不是有效的Observable流,触发这个错误。 - RxJS语法未升级到v6标准:Angular 5中可能允许的一些RxJS写法在v6里不再支持。比如你之前可能直接使用链式操作符(如
.map().filter()),但RxJS 6要求所有操作符必须通过pipe()方法调用,且要从rxjs/operators单独导入。如果代码里还保留着旧写法,就会导致流处理异常。 - watchQuery的配置参数存在问题:检查
contacts.service.ts第75行的watchQuery调用,确认传入的配置是否正确。比如query字段是否指向了有效的GraphQL查询文档(确保是通过gql标签解析后的DocumentNode对象),variables参数是否是预期的类型,有没有传入非Observable/Promise的无效对象作为配置项。 - 依赖安装不完整或版本冲突:迁移过程中如果没有同步升级所有相关依赖,比如
apollo-client、graphql等包的版本和Angular 6不匹配,可能会导致内部模块调用时出现类型不匹配,最终抛出这个错误。
针对这些问题,你可以尝试以下解决步骤:
- 升级apollo相关依赖版本:查看
package.json,确保apollo-angular至少升级到1.3.x版本(适配Angular 6),同时rxjs版本保持在6.x,apollo-client、graphql也同步升级到对应兼容版本。 - 修改RxJS代码为v6写法:把所有链式操作符改成
pipe()包裹的形式,比如将.map(data => data)改为.pipe(map(data => data)),并且确保操作符都从rxjs/operators导入。 - 检查watchQuery调用代码:确认第75行的
watchQuery配置中,query是正确的GraphQL查询,variables如果是动态生成的,要保证它的类型正确,没有返回非预期的对象。 - 重新安装依赖:删除
node_modules和package-lock.json(或yarn.lock),然后重新执行npm install(或yarn install),确保所有依赖都能正确匹配安装。
内容的提问来源于stack exchange,提问作者Yamn Gustavo Mrquez Hechavarra
相关产品推荐
相关产品推荐

