尝试将架构与 apollo 服务器拼接时无法读取未定义的 属性 'args'
Getting Cannot read property 'args' of undefined when trying to stitch schema's with apollo server
似乎有一些类似的问题,但 none 与我收到错误的地方相同,none 未定义 'args'。
我已经开始使用多个其他 graphql api 并将它们合并。只是合并它们进展顺利,但是当我尝试缝合时,出现如下错误:
"errors": [
{
"message": "Cannot read property 'args' of undefined",
"locations": [
{
"line": 9,
"column": 9
}
],
"path": [
"flows",
"edges",
0,
"node",
"sourceAddresses"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"stacktrace": [
"TypeError: Cannot read property 'args' of undefined",
" at /opt/node_modules/graphql-tools/src/transforms/AddArgumentsAsVariables.ts:103:15",
" at Array.forEach (<anonymous>)",
" at /opt/node_modules/graphql-tools/src/transforms/AddArgumentsAsVariables.ts:95:39",
" at Array.map (<anonymous>)",
" at addVariablesToRootField (/opt/node_modules/graphql-tools/src/transforms/AddArgumentsAsVariables.ts:66:36)",
" at AddArgumentsAsVariablesTransform.transformRequest (/opt/node_modules/graphql-tools/src/transforms/AddArgumentsAsVariables.ts:31:11)",
" at /opt/node_modules/graphql-tools/src/transforms/transforms.ts:24:21",
" at Array.reduce (<anonymous>)",
" at Object.applyRequestTransforms (/opt/node_modules/graphql-tools/src/transforms/transforms.ts:21:21)",
" at /opt/node_modules/graphql-tools/src/stitching/delegateToSchema.ts:90:28"
]
}
}
}
]
我有一个 schemaRetriever 服务,可以从 3 个 GraphQL Api 中检索模式。现在我正在尝试让 1 针工作,所以代码现在不是真的 'nice'。
这是我尝试缝合的代码片段:
const aSchema = await this.schemaRetrieverService.retrieveASchema();
const housesSchema = await this.schemaRetrieverService.retrieveHousesSchema();
const addressSchema = await this.schemaRetrieverService.retrieveAddressSchema();
return mergeSchemas({
schemas: [
aSchema,
housesSchema,
addressSchema,
`
extend type Houses {
houseAddresses: Addresses
}
extend type Addresses {
houses: Houses
}
type Query {
addressByHouseId(id: ID!): Addresses
}
`
],
resolvers: {
Houses: {
houseAddresses: {
fragment: `... on Houses { id }`,
resolve(house, args, context, info) {
return info.mergeInfo.delegateToSchema({
schema: addressSchema,
operation: 'query',
fieldName: 'addressByHouseId',
args: {
id: house.houseAddress,
},
context,
info,
});
},
},
},
},
});
我已验证 'house.houseAddress' 包含所需的正确 ID,尽管我在 args 变量中输入了有效 ID,但我仍然收到相同的错误。我在这里遗漏了什么小东西吗?还是大?如果有人能给我指点,我将不胜感激。
非常感谢,如果缺少任何信息,请告诉我,我会尝试添加所有必要的信息。
我已经找到了这个问题的答案,因为分享很重要,所以我会在这里回答我自己的问题。
因为我是新手,所以我真的不知道后台发生了什么。对于可能面临同样问题的人。
因为我太专注于拼接,所以我忘记了我的微服务中有可用的功能,我可以为这些功能检索架构。拼接时给一个拼接的Fieldname应该是一个可以在实体上调用的函数。
这意味着fieldName:'addressByHouseId',指的是Houses类型上应该存在的函数。
您可以在微服务级别的实体上添加此函数,或者我在我的案例中所做的是指(默认情况下使用 api-平台生成)houses(id) 函数。现在有一个可用于拼接的实际实现。
似乎有一些类似的问题,但 none 与我收到错误的地方相同,none 未定义 'args'。
我已经开始使用多个其他 graphql api 并将它们合并。只是合并它们进展顺利,但是当我尝试缝合时,出现如下错误:
"errors": [
{
"message": "Cannot read property 'args' of undefined",
"locations": [
{
"line": 9,
"column": 9
}
],
"path": [
"flows",
"edges",
0,
"node",
"sourceAddresses"
],
"extensions": {
"code": "INTERNAL_SERVER_ERROR",
"exception": {
"stacktrace": [
"TypeError: Cannot read property 'args' of undefined",
" at /opt/node_modules/graphql-tools/src/transforms/AddArgumentsAsVariables.ts:103:15",
" at Array.forEach (<anonymous>)",
" at /opt/node_modules/graphql-tools/src/transforms/AddArgumentsAsVariables.ts:95:39",
" at Array.map (<anonymous>)",
" at addVariablesToRootField (/opt/node_modules/graphql-tools/src/transforms/AddArgumentsAsVariables.ts:66:36)",
" at AddArgumentsAsVariablesTransform.transformRequest (/opt/node_modules/graphql-tools/src/transforms/AddArgumentsAsVariables.ts:31:11)",
" at /opt/node_modules/graphql-tools/src/transforms/transforms.ts:24:21",
" at Array.reduce (<anonymous>)",
" at Object.applyRequestTransforms (/opt/node_modules/graphql-tools/src/transforms/transforms.ts:21:21)",
" at /opt/node_modules/graphql-tools/src/stitching/delegateToSchema.ts:90:28"
]
}
}
}
]
我有一个 schemaRetriever 服务,可以从 3 个 GraphQL Api 中检索模式。现在我正在尝试让 1 针工作,所以代码现在不是真的 'nice'。
这是我尝试缝合的代码片段:
const aSchema = await this.schemaRetrieverService.retrieveASchema();
const housesSchema = await this.schemaRetrieverService.retrieveHousesSchema();
const addressSchema = await this.schemaRetrieverService.retrieveAddressSchema();
return mergeSchemas({
schemas: [
aSchema,
housesSchema,
addressSchema,
`
extend type Houses {
houseAddresses: Addresses
}
extend type Addresses {
houses: Houses
}
type Query {
addressByHouseId(id: ID!): Addresses
}
`
],
resolvers: {
Houses: {
houseAddresses: {
fragment: `... on Houses { id }`,
resolve(house, args, context, info) {
return info.mergeInfo.delegateToSchema({
schema: addressSchema,
operation: 'query',
fieldName: 'addressByHouseId',
args: {
id: house.houseAddress,
},
context,
info,
});
},
},
},
},
});
我已验证 'house.houseAddress' 包含所需的正确 ID,尽管我在 args 变量中输入了有效 ID,但我仍然收到相同的错误。我在这里遗漏了什么小东西吗?还是大?如果有人能给我指点,我将不胜感激。
非常感谢,如果缺少任何信息,请告诉我,我会尝试添加所有必要的信息。
我已经找到了这个问题的答案,因为分享很重要,所以我会在这里回答我自己的问题。 因为我是新手,所以我真的不知道后台发生了什么。对于可能面临同样问题的人。
因为我太专注于拼接,所以我忘记了我的微服务中有可用的功能,我可以为这些功能检索架构。拼接时给一个拼接的Fieldname应该是一个可以在实体上调用的函数。
这意味着fieldName:'addressByHouseId',指的是Houses类型上应该存在的函数。
您可以在微服务级别的实体上添加此函数,或者我在我的案例中所做的是指(默认情况下使用 api-平台生成)houses(id) 函数。现在有一个可用于拼接的实际实现。