簡體   English   中英

將 apollo-server-express 遷移到 @apollo/server 或 graphql-yoga

[英]Migrating apollo-server-express to @apollo/server or graphql-yoga

apollo-server-expressapollo-server-cloud-functions已棄用,大多數在線教程顯示如何使用 graphql 設置 firebase CF 依賴。 我希望有人可以幫助我(當然還有其他人),遷移東西以便他們使用@apollo/server v4,或者使用另一個開源庫,比如graphql-yoga

首先,這是直到最近我的服務器設置方式:

import { ApolloServer } from "apollo-server-express";
import admin from "firebase-admin";
import express from "express";
import schema from "./schema";
import resolvers from "./resolvers";
import UsersAPI from "./datasources/users";
const serviceAccount = require("../../private/serviceAccount.json");
const databaseURL = "https://my-app.firebaseio.com";

const globalServerApp = admin.initializeApp(
  { credential: admin.credential.cert(serviceAccount), databaseURL },
  "server"
);
const globalDataSources = {
  usersAPI: new UsersAPI(globalServerApp)
};

const initServer = () => {
  const app = express();
  const server = new ApolloServer({
    typeDefs: schema,
    resolvers,
    dataSources: () => {
      return globalDataSources;
    },
    uploads: false,
    introspection: true,
    playground: true,
    context: async ({ req }) => {
      return {
        request: req,
      };
    },
  });
  server.applyMiddleware({ app, path: "/", cors: true });
  return app;
};

export default initServer;

此外,我將為用戶架構提供以下內容:

import { gql } from "apollo-server-express";

const UserSchema = gql`
  scalar JSONObject
  type Something {
    customer: String
  }

  extend type Query {
    doSomething(someIDs: [String]): [Something]
  }

  extend type Mutation {
    completeRegistration(
      uid: ID!
      first_name: String
      last_name: String
      invited_by: JSONObject
    ): Boolean
  }
`;

export default UserSchema;

您將如何使用@apollo/server v4、 graphql-yoga或其他簡單方法編寫這些內容?

您使用的apollo-server-express版本與@apollo/server v4 的主要區別是:

  1. 顯然,Package 名稱更改。
  2. 服務器實現已被刪除。 這樣做是為了實現社區所有,而不是他們必須學習每一個新事物。 幸運的是, express中間件仍在主要 package 中,但現在您可以使用expressMiddleware包裝器 function 而不是applyMiddleware
  3. Playground 被棄用並移除,取而代之的是 Apollo 自己的“Apollo Sandbox”。 如果您更喜歡 GraphQL Playground,則需要安裝一個名為@apollo/server-plugin-landing-page-graphql-playground 下面的代碼假定您已經安裝了它。
  4. context成為特定於實現的 function,因此不再位於 ApolloServer 配置中。 現在在expressMiddleware function 上。
  5. 數據源不再位於根配置中。 如果需要, context dataSources的返回現在應該包括數據源。 這通常應該更直接一些。

將所有這些放在一起(雖然,誠然,沒有你的代碼,所以我無法實際測試這個東西運行),這就是我希望為你工作的:

// These are the new packages
import { ApolloServer } from '@apollo/server';
import { expressMiddleware } from '@apollo/server/express4';
import { ApolloServerPluginLandingPageGraphQLPlayground } from '@apollo/server-plugin-landing-page-graphql-playground';

import admin from 'firebase-admin';
import express from 'express';
import schema from './schema';
import resolvers from './resolvers';
import UsersAPI from './datasources/users';
const serviceAccount = require('../../private/serviceAccount.json');
const databaseURL = 'https://my-app.firebaseio.com';

const globalServerApp = admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL }, 'server');
const globalDataSources = {
  usersAPI: new UsersAPI(globalServerApp),
};

const initServer = () => {
  const app = express();
  const server = new ApolloServer({
    typeDefs: schema,
    resolvers,
    introspection: true,
    plugins: [ApolloServerPluginLandingPageGraphQLPlayground()],
  });

  app.use(
    '/',
    expressMiddleware(server, {
      context: async ({ req }) => {
        return {
          request: req,
          dataSources: globalDataSources,
        };
      },
    }),
  );
  return app;
};

export default initServer;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM