使用 graphql、aws lambda 和无服务器框架的多个 url 路径选项错误

Posted

技术标签:

【中文标题】使用 graphql、aws lambda 和无服务器框架的多个 url 路径选项错误【英文标题】:Multiple url path option error using graphql, aws lambda and serverless framework 【发布时间】:2020-03-11 06:35:38 【问题描述】:

我正在使用无服务器框架将 graphql nodejs 包部署到 lambda 函数。

我当前的serverless.yml 文件涉及一个用于所有通信的POST 方法以及另一个用于游乐场的方法,如下所示。

functions:
  graphql:
    handler: handler.server
    events:
      - http:
          path: /
          method: post
          cors: true
  playground:
    handler: handler.playground
    events:
      - http:
          path: /
          method: get
          cors: true

我的 handler.ts 看起来像这样。

const  GraphQLServerLambda  = require("graphql-yoga");
const documentSubmissionMutation = require('./mutations/documentMutation');
const signUpMutation, whatever = require('./mutations/signUpMutation');

const typeDefs = `
  type Query 
    hello(name: String): String!
  ,
  type Mutation 
    signUp(
      email: String!
      password: String!
    ): String

    sendDocuments(
      user_id: String!
      documents: String!
    ): String!
  
`

const resolvers = 
  Query : 
    hello : whatever
  ,
  Mutation: 
    sendDocuments: documentSubmissionMutation,
    signUp: signUpMutation,
  


const lambda = new GraphQLServerLambda(
    typeDefs,
    resolvers
);

exports.server = lambda.graphqlHandler;
exports.playground = lambda.playgroundHandler;

我现在想做的是有 3 条不同的路径。 1 表示安全,1 表示公共,1 表示管理员。 所以基本上 URL 会是这样的。 localhost/publiclocalhost/secrelocalhost/admin 安全路径将使用 aws cognito 池来识别 API 用户 api,并且另一个将是打开的。管理员将使用另一个 aws cognito 管理池。

所以我首先做的是像这样添加它以确保安全。

const lambda = new GraphQLServerLambda(
    typeDefs,
    resolvers,
    context: req => ( ...req )
);

const lambdaSecure = new GraphQLServerLambda(
  typeDefsSecure,
  resolversSecure,
  context: req => ( ...req )
);


exports.server = lambda.graphqlHandler;
exports.playground = lambda.playgroundHandler;

exports.serverSecure = lambdaSecure.graphqlHandler;
exports.playgroundSecure = lambdaSecure.playgroundHandler;

然后在我的 serverless.yml 文件中尝试这样放。

functions:
  graphql:
    handler: handler.server
    events:
      - http:
          path: /
          method: post
          cors: true
  graphql:
    handler: handler.serverSecure
    events:
      - http:
          path: /
          method: post
          cors: true

  playground:
    handler: handler.playground
    events:
      - http:
          path: /
          method: get
          cors: true
  playground:
    handler: handler.playgroundSecure
    events:
      - http:
          path: /
          method: get
          cors: true

它不起作用并引发错误 duplicated mapping key in "/Users/nihit/Desktop/serverless/cvtre/serverless.yml" at line 50, column -135: graphql:

我以不同的方式进行了尝试,但我不确定哪一种是获取两个不同 URL 路径的正确方法。

【问题讨论】:

【参考方案1】:

问题似乎出在您的serverless.yml 中。特别是在功能规范中。 pathmethod 的组合以及函数名称对于每个函数必须是唯一的。

所以,serverless.yml 应该如下所示:

functions:
  graphqlServer:
    handler: handler.server
    events:
      - http:
          path: server/public
          method: post
          cors: true
  graphqlServerSecure:
    handler: handler.serverSecure
    events:
      - http:
          path: server/secure
          method: post
          cors: true

  playground:
    handler: handler.playground
    events:
      - http:
          path: playground/public
          method: get
          cors: true
  playgroundSecure:
    handler: handler.playgroundSecure
    events:
      - http:
          path: playground/secure
          method: get
          cors: true

【讨论】:

以上是关于使用 graphql、aws lambda 和无服务器框架的多个 url 路径选项错误的主要内容,如果未能解决你的问题,请参考以下文章

在本地测试 Elasticache 和无服务器 AWS Lambda

为 AWS Lambda 和无服务器推荐啥本地节点版本

AWS-LAMBDA:没有这样的文件或目录,打开 './src/graphql/schema.graphql'

从 Lambda 调用 AWS AppSync graphql API

将 Relay/GraphQL 与 AWS Lambda 结合使用

如何在 AWS lambda 上使用 graphql 'isValidJSValue' 或 'coerceValue'?