【问题标题】:Subscription onConnect return value not appended to context订阅 onConnect 返回值未附加到上下文
【发布时间】:2021-08-08 05:49:50
【问题描述】:

我正在使用 type-graphql 创建一个 GraphQL 端点,它还定义了一个订阅。在订阅中,我返回一个包含 currentUser 属性的对象。这就是我创建服务器的方式:

const server = new ApolloServer({ schema, context: (ctx) => {
            if(ctx.connection) {
                console.log(`Inside Connection`);
                //console.log(ctx.connection.context); - I can see currentUser property with an actual user
                let obj = {
                    req: ctx.req,
                    currentUser: ctx.connection.context.currentUser
                };
                console.log(obj);
                return obj;
            }
            return {
                req: ctx.req
            }
        },
        subscriptions: {
            path: "/subscriptions",
            onConnect: async (connectionParams: any) => {
                const token = connectionParams["X-JWT"];
                if(token) {
                    const user = await decodeJWT(token);
                    if(user) {
                        return {
                            currentUser: user
                        }
                    }
                }
                throw new Error("Not Authorised to Subscribe...");
            },
            onDisconnect: () => {
                console.log("Client disconnected from subscriptions");
            }
        } 
    }); 

当我创建解析器并打印上下文时,我无法在上下文中看到 currentUser 属性。

@Resolver()
export class UserResolver {
    @Query(_returns => String)
    async returnHello(@Arg("name") name: string, @Ctx() _ctx: any){
      // console.log("connection")
      console.log(_ctx); // Unable to get currentUser property here
      return `Hello ${name}`;
    };
}

我遵循link 并以类似的方式实现代码。但我仍然没有在解析器的上下文中获取 currentUser 属性。

请帮忙。提前致谢。

【问题讨论】:

    标签: typegraphql


    【解决方案1】:

    我能够解决它。感谢来自不和谐的linus:alpine-edge。帮助澄清了我的理解。由于查询是通过 http 发送的,而订阅是通过 websocket 发送的,因此在查询中我们永远无法访问订阅的上下文。但是在订阅中,我们可以访问上下文对象。以下是订阅:

    import { User } from "../entities/User";
    import { Subscription, Resolver, Root } from "type-graphql";
    
        @Resolver()
        export class DriversSubscription {
            @Subscription(() => User, {
                topics: "driverUpdate",
                filter: ({ context }) => { 
                    console.log(context); // I can see currentUser property
                    return true; 
                },
            })
            async driverUpdate(@Root() payload: User): Promise<User> {
                return payload;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2021-07-16
      • 1970-01-01
      • 2017-07-14
      • 2017-11-12
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2019-12-09
      相关资源
      最近更新 更多