带有打字稿的 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的主要内容,如果未能解决你的问题,请参考以下文章

无法在带有打字稿的 vue 中使用 Mixins

如何在带有打字稿的 vue.js 中使用 javascript 组件?

如何使用带有打字稿的“调试”模块

带有打字稿的玩笑无法识别功能完成()

如何在带有打字稿的反应功能组件中定义自定义道具?

在自定义输入元素上使用带有打字稿的 useRef