如何在ApolloServer中添加响应头?

sag*_*r.a 6 express graphql apollo-server

我正在使用 graphql ApolloServer 并使用以下 Apolloserver

server.applyMiddleware({ app, path: '/graphql' });
Run Code Online (Sandbox Code Playgroud)

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

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

我还尝试添加一段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;
  }
});
Run Code Online (Sandbox Code Playgroud)

有什么选择可以做到这一点吗?

小智 7

new ApolloServer({
  context: ({res}) => {
    res.header('key', 'value')
  }
})
Run Code Online (Sandbox Code Playgroud)

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

  • 虽然此代码片段可以解决问题,但[包括解释](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而那些人可能不知道您建议代码的原因。 (4认同)

Ric*_*ic0 6

const buildContext = async ({ res, req }) =>
  // Attach additional properties to context if needed
  ({
    user: req.user,
    res,
    req
  });

Run Code Online (Sandbox Code Playgroud)

与“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
  },
});

Run Code Online (Sandbox Code Playgroud)