下一个JS服务器端GraphQL订阅

发布于 2025-01-21 07:15:58 字数 147 浏览 1 评论 0原文

我目前正在下一个JS构建聊天应用程序。我将GraphQL与Apollo客户端一起在前端和Apollo服务器中使用。现在我想要实时更新,但是我发现没有支持 apollo-server-micro 中的订阅。当他们在这里写

I am currently building chat app in Next JS. I use graphql with Apollo Client in frontend and Apollo Server on backend. Now I want real time updates, but I found out there is no support for Subscription in apollo-server-micro. As they write here ???? :
https://www.apollographql.com/docs/apollo-server/data/subscriptions#enabling-subscriptions

Beginning in Apollo Server 3, subscriptions are not supported by the
"batteries-included" apollo-server package. To enable subscriptions,
you must first swap to the apollo-server-express package (or any other
Apollo Server integration package that supports subscriptions).

But I can not use apollo-server-express because I use NextAuth for authentication and then I pass it to context:

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,
  };
}

Thanks for help ????.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

伤痕我心 2025-01-28 07:15:59

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

我的页面/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;

I found a solution, for everyone who wants to use graphql subscriptions on server:
Use graphql-yoga instead :
https://www.graphql-yoga.com/docs/features/subscriptions

My code for 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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文