如何在apollo-server-lambda中处理cookie

时间:2019-08-22 12:04:36

标签: lambda graphql serverless apollo-server

使用apollo-server-lambda在无服务器的lambda服务器中设置cookie

我正在从apollo服务器迁移到无服务器版本。有没有办法我可以访问响应对象或另一种设置cookie的方法?

context: ({ event, context }) => ({
   headers: event.headers,
   functionName: context.functionName,
   event,
   context,
 }),

我希望在上下文中能够像在阿波罗服务器中一样访问res对象。

3 个答案:

答案 0 :(得分:4)

您可以使用apollo-server-plugin-http-headers软件包。

在解析器中,用法如此简单:

{{1}}

答案 1 :(得分:3)

我找不到使用apollo-server-lambda做到这一点的方法,所以我所做的就是结合使用apollo-server-expressserverless-http。下面的代码正在使用导入/导出,因为我正在使用打字稿。

serverless-http接受各种类似Express的框架。

import express from 'express'; // <-- IMPORTANT
import serverlessHttp from 'serverless-http'; // <-- IMPORTANT
import { ApolloServer } from 'apollo-server-express'; // <-- IMPORTANT
import typeDef from './typeDef';
import resolvers from './resolvers';

export const server = new ApolloServer({
    typeDef,
    resolvers,
    context: async ({ req, res }) => {
        /**
         * you can do anything here like check if req has a session,
         * check if the session is valid, etc...
         */
        return {
            // things that it'll be available to the resolvers
            req,
            res,
        };
    },
});

const app = express(); // <-- IMPORTANT

server.applyMiddleware({ app }); // <-- IMPORTANT

// IMPORTANT
// by the way, you can name the handler whatever you want
export const graphqlHandler = serverlessHttp(app, {
    /** 
     * **** IMPORTANT ****
     * this request() function is important because 
     * it adds the lambda's event and context object 
     * into the express's req object so you can access
     * inside the resolvers or routes if your not using apollo
     */
    request(req, event, context) { 
        req.event = event;
        req.context = context;
    },
});

例如,现在您可以在解析器中使用res.cookie()

import uuidv4 from 'uuid/v4';

export default async (parent, args, context) => {
// ... function code

const sessionID = uuidv4();

// a example of setting the cookie
context.res.cookie('session', sessionID, {
        httpOnly: true,
        secure: true,
        path: '/',
        maxAge: 1000 * 60 * 60 * 24 * 7,
    });
}

另一个有用的resource

答案 2 :(得分:0)

您需要一种在解析器中设置响应头的方法。

您可以做的是在解析器中为上下文对象设置一个值。

const resolver = (parent, args, { context }) => {
  context.addHeaders = [{ key: 'customheader', value: 'headervalue'}]
}

您可以通过创建event in the server lifecycle来捕获willSendResponse Apollo Server plugin中的上下文。然后,您可以将标头从customHeaders属性添加到GraphQLResponse对象。

const customHeadersPlugin = {
  requestDidStart(requestContext) {
    return {
      willSendResponse(requestContext) {
        const {
          context: { addHeaders = [] }
        } = requestContext.context

        addHeaders.forEach(({ key, value }) => {
          requestContext.response.http.headers.append(key, value)
        })

        return requestContext
      }
    }
  }
}

您需要在Apollo Server中加载插件。

const server = new ApolloServer({
  typeDefs,
  resolvers,
  plugins: [customHeadersPlugin],
  context: ({ context }) => ({
    context
  })
})

现在,您已经可以在解析程序中修改响应标头。为了能够设置Cookie,您可以使用Cookie字符串或使用Set-Cookie手动设置cookie library标头。


感谢Apollo GraphQL团队的Trevor Scheer在我需要自己实现此目标时为我指明正确的方向。