ApolloServer 模式选项

Posted

技术标签:

【中文标题】ApolloServer 模式选项【英文标题】:ApolloServer schema option 【发布时间】:2021-10-22 13:06:17 【问题描述】:

我正在观看关于 react、graphQL、typeScript 和 apollo 服务器部分的 youtube 全栈教程,我尝试在 schema 选项中传递 buildSchema(function from type-graphql) 并收到此错误消息

我的代码 - 我正在使用打字稿

import  MikroORM  from "@mikro-orm/core";
import  __port__, __prod__  from "./constants";
import  Post  from "./entity/Post";
import express from "express";
import  ApolloServer  from "apollo-server-express";
import  buildSchema, Query, Resolver  from "type-graphql";

@Resolver()
class HelloResolver 
  @Query(() => String)
  hello() 
    return "hi";
  


const main = async () => 
  const orm = await MikroORM.init();
  await orm
    .getMigrator()
    .up()
    .catch((err) => );
  const app = express();

  const apolloServer = new ApolloServer( // line 24
    schema: await buildSchema(
      resolvers: [HelloResolver],
    ),
  );

  apolloServer.applyMiddleware( app );

  app.listen(__port__, () => 
    console.log(`server started on localhost:$__port__/graphql`);
  );
;

main().catch((err) => 
  console.log(err);
);

我的错误信息

PATH/node_modules/ts-node/src/index.ts:307
        throw new TSError(formatDiagnostics(diagnosticList, cwd, ts, lineOffset))
              ^
TSError: ⨯ Unable to compile TypeScript
src/index.ts (24,41): Argument of type ' schema: GraphQLSchema; ' is not assignable to parameter of type 'Config<ExpressContext>'.
  Type ' schema: GraphQLSchema; ' is missing the following properties from type 'Config<ExpressContext>': formatError, debug, rootValue, validationRules, and 6 more. (2345)
    at getOutput (PATH/node_modules/ts-node/src/index.ts:307:15)
    at PATH/node_modules/ts-node/src/index.ts:336:16
    at Object.compile (PATH/node_modules/ts-node/src/index.ts:498:11)
    at Module.m._compile (PATH/node_modules/ts-node/src/index.ts:392:43)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (PATH/node_modules/ts-node/src/index.ts:395:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:79:12)
    at Object.<anonymous> (PATH/node_modules/ts-node/src/_bin.ts:182:12)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

【问题讨论】:

【参考方案1】:

我遇到了同样的问题,对我来说,这是因为有一个嵌套的 repo 结构。 ts-node 和 typescript 依赖项安装在与我运行 yarn start 不同的位置。

我可以通过卸载 ts-node 和 typescript npm uninstall ts-node typescript,进入我的项目根目录(我有我的 start 脚本设置)并重新安装 ts-node 和 ts npm install -D ts-node typescript 来解决这个问题。 /p>

【讨论】:

这行得通。谢谢!【参考方案2】:

解决方法是在 ApolloServer 对象参数后添加as Config&lt;ExpressContext&gt;

const apolloServer = new ApolloServer(
    schema: ...
   as Config<ExpressContext>);

【讨论】:

以上是关于ApolloServer 模式选项的主要内容,如果未能解决你的问题,请参考以下文章

Apollo Server - 关于缓存/数据源选项的困惑

错误:Apollo Server 需要现有的模式、模块或 typeDefs

Apollo Server 重置 CORS 选项 [重复]

Apollo Server 的 gql 标签和 schema.gql 文件有啥区别?

如何调试 nuxt-apollo 服务器端 graphql 请求

Apollo Server 2.x express 中间件