【问题标题】:How to add a response header in ApolloServer?如何在 ApolloServer 中添加响应头?
【发布时间】:2020-01-10 13:57:26
【问题描述】:

我正在使用 graphql ApolloServer 并为 Apolloserver 使用以下内容

server.applyMiddleware({ app, path: '/graphql' });

我需要在响应头中传递解析器返回的错误。

我阅读了文档,但看起来我们无法在上述中间件之后添加另一个中间件。

我还尝试在初始化服务器时添加formatResponse,但这里的对象不是我可以更改错误标头的实际 http 响应。

const server = new ApolloServer({
  schema,
  validationRules: [depthLimit(7)],
  playground: process.env.NODE_ENV !== 'production',
  debug: process.env.NODE_ENV !== 'production',
  formatError: err => {
    // Don't give the specific errors to the client.
    if (err.message.startsWith('Database Error: ') || err.message.startsWith('connect')) {
      return new Error('Internal server error');
    }

    // Otherwise return the original error. The error can also
    // be manipulated in other ways, so long as it's returned.
    return err;
  },
  formatResponse: (res:any,options:any) => {

   // can't set headers here as it is not the http response object.


    return res;
  }
});

是否有任何选项可以做到这一点?

【问题讨论】:

    标签: express graphql apollo-server


    【解决方案1】:
    const buildContext = async ({ res, req }) =>
      // Attach additional properties to context if needed
      ({
        user: req.user,
        res,
        req
      });
    
    

    与“apollo-server-express”集成包一起使用。

    import { ApolloServer } = 'apollo-server-express';
    ...
    const server = new ApolloServer({
      // schema, etc...
      context: ({ res, req }) => buildContext({ res, req }),
      formatResponse: (response, query ) => {
        const { context } = query;
        const { res, req: request } = context; // http response and request
        // now you can set http response headers
       // res.set(...)
    
    
        const { data } = response;  // graphql response's data
        const { headers = {} } = request; // http request headers
        return response; // graphql response
      },
    });
    
    

    【讨论】:

    • 为什么请求未定义
    • 我已经更新了答案,指出还需要手动将请求添加到 apollo 服务器上下文处理程序的上下文中。
    【解决方案2】:
    new ApolloServer({
      context: ({res}) => {
        res.header('key', 'value')
      }
    })
    

    参考:https://www.apollographql.com/docs/apollo-server/api/apollo-server/

    【讨论】:

    • 虽然这段代码 sn-p 可以解决问题,including an explanation 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
    • 我实际上还是不明白,如何从突变中设置“值”?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多