接下来JS服务器端的graphql订阅



我目前正在Next JS中构建聊天应用程序。我在前端使用graphql,在后端使用Apollo Server。现在我想要实时更新,但我发现apollo服务器micro中不支持订阅。正如他们在这里写的那样😢 :https://www.apollographql.com/docs/apollo-server/data/subscriptions#enabling-订阅

从Apollo Server 3开始"电池包括";apollo服务器包。为了启用订阅,您必须首先交换到apollo服务器express包(或任何其他支持订阅的Apollo Server集成包(。

但我不能使用apollo服务器express,因为我使用NextAuth进行身份验证,然后将其传递到上下文:

export async function createContext({
req,
res,
}: {
req: NextApiRequest;
res: NextApiResponse;
}): Promise<Context> {
const session = await getSession({ req });
const user = { ...session?.user, _id: session?.userId } as User;
const db = await dbConnect();
return {
user,
db,
};
}

谢谢你的帮助👍.

我找到了一个解决方案,适用于所有想在服务器上使用graphql订阅的人:
改为使用graphql-yoga:https://www.graphql-yoga.com/docs/features/subscriptions

我的pages/api/graphql.ts:代码

import { createServer, createPubSub, PubSub } from "@graphql-yoga/node";
import { NextApiRequest, NextApiResponse } from "next";
import { Session } from "next-auth";
import { getSession } from "next-auth/react";
const pubSub = createPubSub<{
"user:newMessage": [userId: string, message: Message];
"user:newChat": [userId: string, chat: Chat];
}>();
export type pubSub = typeof pubSub;
const server = createServer<
{
req: NextApiRequest;
res: NextApiResponse;
},
{
user: User;
pubSub: any;
}           
>({
context: async ({ req }) => {
const session = await getSession({ req });
await dbConnect();
return {
user: { ...session?.user, _id: session?.userId } as User,
pubSub,
};
},
schema: {
typeDefs,
resolvers: {
Query,
Mutation,
Subscription,
},
},
});
export default server;

最新更新