使用AWS Lambda的Apollo Server部署中的错误

时间:2020-06-30 03:22:09

标签: javascript aws-lambda graphql apollo apollo-server

人们,你好吗?我有一个查询,我刚刚在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 个答案:

答案 0 :(得分:0)

据我所知,您没有在上下文中调用getUserByToken。那是对的吗?因此,我不确定您如何遇到此错误。

我可以给你一些建议吗?

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


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

我认为您打算在此行中调用您的getUserByToken:

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