使用 AWS Lambda 部署 Apollo 服务器时出错

Posted

技术标签:

【中文标题】使用 AWS Lambda 部署 Apollo 服务器时出错【英文标题】:Error in Apollo Server deploy with AWS Lambda 【发布时间】:2020-10-20 07:18:42 【问题描述】:

各位,你们好吗?我有一个疑问,我刚刚在 AWS Lambda 中实现了使用 apollo 服务器创建的 API。我使用官方文档作为指南,但我注意到上下文处理有所不同。我对后者有疑问,因为我进行了某些更改,并且使用“无服务器离线”在本地一切正常,但是一旦我部署它就不行了。显然,我生成的身份验证上下文没有完成我的查询。如果有人可以指导我,我将非常感激。

这是我的 API 索引:

const  ApolloServer, gql  = require('apollo-server-lambda');
const typeDefs = require('./db/schema');
const resolvers = require('./db/resolvers');
const db = require('./config/db');
const jwt = require('jsonwebtoken');

require('dotenv').config( path: 'variables.env' );

db.conectDB();

// The ApolloServer constructor requires two parameters: your schema
// definition and your set of resolvers.
const server = new ApolloServer( 
  typeDefs,
  resolvers,
  playground:  
    endpoint: "/graphql"
  ,
  context: ( event, context ) => 
    try 
      const token = event.headers['authorization'] || '';
      
      if(token)
        context.user = jwt.verify(token.replace('Bearer ',''), process.env.KEY_TOKEN);
      
      
      return 
        headers: event.headers,
        functionName: context.functionName,
        event,
        context,
      
     catch (error) 
      console.error(error);
    
  
);

exports.graphqlHandler = server.createHandler(
  cors: 
    origin: '*',
    credentials: true,
  ,
);

这是我的查询:

        getUserByToken: async (_, ,  context ) => 
            if(context)
                throw new Error((context ? 'context' : '') + ' ' + (context.user ? 'user' : ''));
            let user = await db.findOne('users', _id: ObjectId(context.user._id) );

            if(user.birthdate)
                    user.birthdate = user.birthdate.toString();

            if(user.password)
                user.password = true;
            else
                user.password = false;

            return user;
        

我的 API 响应: API response

【问题讨论】:

【参考方案1】:

据我所知,您并没有在您的上下文中调用 getUserByToken 。那是对的吗?所以,我不确定你是怎么遇到这个错误的。

我能给你一些建议吗?

连接到您的数据库可能是(或应该是)异步的。为此,我会像这样运行您的代码:


db.connect()
  .then(() => 
   ... handle your request in here
  )
  .catch(console.error);

我认为您的意思是在这一行中调用您的 getUserByToken:

context.user = jwt.verify(token.replace('Bearer ',''), process.env.KEY_TOKEN);

【讨论】:

以上是关于使用 AWS Lambda 部署 Apollo 服务器时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS lambda Web 控制台上测试 Apollo graphql 查询

AWS Lambda 中的 Apollo Server Graphql

无服务器框架+ AWS + Lambda + DynamoDB + GraphQL + Apollo Server =无法使POST请求工作

无服务器框架 + AWS + Lambda + DynamoDB + GraphQL + Apollo Server = 无法使 POST 请求工作

是否可以将 apollo-server-express 部署到 lambda?

AWS 云中带有订阅的 Apollo GraphQL 服务器