升级@graphql-mesh至最新版本时sdkRequesterFactory报错如何解决
@graphql-mesh 升级后 sdkRequester 适配 sdkRequesterFactory 方案
本次升级涉及的依赖版本
"@graphql-mesh/cache-file": "^0.8.23", "@graphql-mesh/cache-inmemory-lru": "^0.6.18", "@graphql-mesh/cache-redis": "^0.9.8", "@graphql-mesh/cli": "^0.71.3", "@graphql-mesh/config": "0.37.3", "@graphql-mesh/graphql": "^0.26.2", "@graphql-mesh/merger-stitching": "^0.15.52", "@graphql-mesh/runtime": "^0.35.2", "@graphql-mesh/transform-cache": "^0.12.13",
问题现象
依赖升级完成后运行抛出异常,旧版本中直接从getMesh返回值解构的sdkRequester在新版本中被替换为sdkRequesterFactory,多次调试写法均无法正常运行。
调试阶段编写的问题代码
import { getMesh } from '@graphql-mesh/runtime'; import { findAndParseConfig } from '@graphql-mesh/cli'; import { getSdk } from './__generated__/sdk'; async function load() { const meshConfig = await findAndParseConfig(); const {sdkRequesterFactory, meshContext }= await getMesh(meshConfig); const sdkRequester = sdkRequesterFactory(meshContext); const sdk = getSdk(sdkRequester); return sdk; }
旧版本可正常运行的参考代码
import { getMesh } from '@graphql-mesh/runtime'; import { findAndParseConfig } from '@graphql-mesh/config'; import { getSdk } from './__generated__/sdk'; async function load() { const meshConfig = await findAndParseConfig(); const { sdkRequester } = await getMesh(meshConfig); const sdk = getSdk(sdkRequester); return sdk; } async function loadMesh() { try { const sdk = await load(); return sdk; } catch (error) { console.error('createServiceBinding Error', error); throw new Error(`Mesh SDK Load error: ${error}`); } } export default loadMesh;
修复方案
报错由两个写法错误导致:
- 新版本
getMesh返回值中不存在meshContext属性,解构该值得到的是undefined sdkRequesterFactory的设计目的是支持自定义请求上下文,无自定义需求时直接调用即可,不需要传入参数,工厂函数会自动使用Mesh默认生成的上下文。
修复后的完整可运行代码:
import { getMesh } from '@graphql-mesh/runtime'; import { findAndParseConfig } from '@graphql-mesh/config'; import { getSdk } from './__generated__/sdk'; async function load() { const meshConfig = await findAndParseConfig(); const { sdkRequesterFactory } = await getMesh(meshConfig); // 直接调用工厂函数生成requester,无需传参 const sdkRequester = sdkRequesterFactory(); const sdk = getSdk(sdkRequester); return sdk; } async function loadMesh() { try { const sdk = await load(); return sdk; } catch (error) { console.error('createServiceBinding Error', error); throw new Error(`Mesh SDK Load error: ${error}`); } } export default loadMesh;
如果后续有单次请求自定义上下文的需求,调用sdkRequesterFactory时传入对应上下文对象即可:
const customContext = { userId: '123', requestId: 'xxx' }; const sdkRequester = sdkRequesterFactory(customContext);
内容的提问来源于stack exchange,提问作者sandeep pandey
相关产品推荐
相关产品推荐

