带有打字稿的 Apollo 网关不会在上下文中接受用户 ID
Posted
技术标签:
【中文标题】带有打字稿的 Apollo 网关不会在上下文中接受用户 ID【英文标题】:Apollo gateway with typescript wont accept user ID in context 【发布时间】:2020-01-15 05:59:09 【问题描述】:我一直在尝试使用 typescript 实现 Apollo 的新网关。但是我一直遇到一个我似乎无法解决的打字稿问题。错误消息是“类型 'TContext'.ts(2339) 上不存在属性 'userId'”。注意我正在尝试在 AWS Lambda 上实施。
据我所知,通过查看包源代码 TContext = Record 是一个对象,但它似乎无法解析。
import ApolloServer from 'apollo-server-lambda';
import ApolloGateway, RemoteGraphQLDataSource from '@apollo/gateway';
const gateway = new ApolloGateway(
serviceList: [
name: 'users', url: 'xx' ,
name: 'precedents', url: 'xx'
// other services
],
buildService( url )
return new RemoteGraphQLDataSource(
url,
willSendRequest( request, context )
// pass the user's id from the context to underlying services
// as a header called `user-id`
request && request.http && request.http.headers.set('user-id', context.userId);
);
);
const server = new ApolloServer(
gateway,
subscriptions: false,
context: ( event, context ) =>
// get the user token from the headers
const token = event.headers.authorization || '';
// try to retrieve a user with the token
const userId = token;
// add the user to the context
return
headers: event.headers,
functionName: context.functionName,
event,
context,
userId
;
);
exports.handler = server.createHandler(
cors:
origin: true,
credentials: true,
methods: ['POST', 'GET'],
allowedHeaders: ['Content-Type', 'Origin', 'Accept', 'authorization']
);
编辑 按照下面的更新似乎会导致同样的问题。
interface MyContext
userId: string;
const gateway = new ApolloGateway(
serviceList: [
name: 'users', url: 'xx' ,
name: 'precedents', url: 'xx'
// other services
],
buildService( url )
return new RemoteGraphQLDataSource(
url,
willSendRequest<MyContext>( request, context : request: GraphQLRequest, context: MyContext)
// pass the user's id from the context to underlying services
// as a header called `user-id`
request && request.http && request.http.headers.set('user-id', context.userID);
);
);
【问题讨论】:
【参考方案1】:首先,创建一个接口,它将描述您的 graphql 上下文
interface MyContext
userId: string;
然后像这样将 MyContext 类型参数添加到 willSendRequest 方法中
...
willSendRequest<MyContext>(request, context)
...
现在编译器知道,上下文是 MyContext 类型。
【讨论】:
感谢您的回复。抱歉,我对 Typescript 还是很陌生,仍然无法解决 Typescript 错误。更新的代码仍然给出同样的错误?上面已经用新代码更新了。 willSendRequest 不接受类型。然而,RemoteGraphQLDataSource 确实可以,但对我来说仍然不太合适。接近,但不是一路。以上是关于带有打字稿的 Apollo 网关不会在上下文中接受用户 ID的主要内容,如果未能解决你的问题,请参考以下文章