尝试将服务推送到 Apollo Engine 时,如何修复“将服务上传到引擎 → 未知指令“密钥””错误?

Posted

技术标签:

【中文标题】尝试将服务推送到 Apollo Engine 时,如何修复“将服务上传到引擎 → 未知指令“密钥””错误?【英文标题】:How to fix 'Uploading service to Engine → Unknown directive "key"' error when trying to push a service to Apollo Engine? 【发布时间】:2020-02-29 19:26:34 【问题描述】:

当我尝试通过apollo service:push --endpoint=http://localhost:4001 将我的 apollo-server 应用程序推送到 Apollo 引擎时出现错误: Uploading service to Engine → Unknown directive "key".我做错了什么?

我目前正在设置一个包含一堆微服务的后端项目,并且我想使用 Apollos 新的托管联合功能,其中每个微服务的 graphql 模式都被推送到 Apollo 图形管理器并由 apollo 网关服务器组合。

我的架构如下所示:

extend type Query 
  me: User


type User @key(fields: "id") 
  id: ID!
  name: String
  username: String

这些是我的解析器:

const resolvers = 
  Query: 
    me() 
      return users[0];
    
  ,
  User: 
    __resolveReference(object) 
      return users.find(user => user.id === object.id);
    
  
;

这是我的服务器设置:

const server = new ApolloServer(
  schema: buildFederatedSchema([ typeDefs, resolvers ])
);

server.listen( port: 4001 ).then(( url ) => 
  console.log(`Server ready at $url`);
);

apollo.config.js

module.exports = 
  service: 
    localSchemaFile: "./src/graphql/schema.graphql"
  
;

这是完整的错误信息:

npx apollo service:push --endpoint=http://localhost:4001
  √ Loading Apollo Project
  × Uploading service to Engine
    → Unknown directive "key".
GraphQLSchemaValidationError: Unknown directive "key".
    at Object.buildSchemaFromSDL (C:/Users/Juliu/AppData/Roaming/npm-cache/_npx/13168/node_modules/apollo/node_modules/apollo-graphql/lib/schema/buildSchemaFromSDL.js:38:15)
    at FileSchemaProvider.resolveSchema (C:/Users/Juliu/AppData/Roaming/npm-cache/_npx/13168/node_modules/apollo/node_modules/apollo-language-server/lib/providers/schema/file.js:24:40)
    at GraphQLServiceProject.resolveSchema (C:/Users/Juliu/AppData/Roaming/npm-cache/_npx/13168/node_modules/apollo/node_modules/apollo-language-server/lib/project/base.js:66:36)
    at Task.task (C:/Users/Juliu/AppData/Roaming/npm-cache/_npx/13168/node_modules/apollo/lib/commands/service/push.js:70:50)

【问题讨论】:

有同样的问题。从那以后你找到解决方案了吗? 也有类似的解决方案。我开始认为推出我们自己的托管图形服务可能更有意义。 Apollo Federation Graph Manager 的文档很糟糕。 【参考方案1】:

我在运行时遇到了同样的错误:

npx apollo service:push \
--key=$APOLLO_KEY \
--graph=$GRAPH_NAME \
--variant=$GRAPH_VARIANT\
--serviceName=$SERVICE_NAME \
--serviceURL=$SERVICE_URL \
--localSchemaFile=./src/schema.graphql

出现错误是因为 apollo 工具不知道 apollo 联合指令。

使用此命令安装联邦:

yarn add @apollo/federation

重新运行第一个命令,它工作正常! (我从 Apollo Studio Support 得到了这个答案)

【讨论】:

【参考方案2】:

如果您有多个架构文件,您想使用逗号连接它们

npx apollo service:push --localSchemaFile=$(find src/main/resources/graphql -name "*.graphqls" | tr "\n" "," | sed 's/.$//') --key=$APOLLO_KEY

src/main/resources/graphql 是架构目录的路径

【讨论】:

以上是关于尝试将服务推送到 Apollo Engine 时,如何修复“将服务上传到引擎 → 未知指令“密钥””错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何将验证码推送到生产服务器

使用 php 将数据推送到 websocket 服务器

当git从计算机推送到vps服务器时,权限被拒绝公钥[重复]

Google App Engine Docker容器502错误网关

当我尝试将我的应用推送到 Heroku 时,我收到了以下回复:

将存储库推送到 Github 时权限被拒绝 [重复]