如何在 ApolloServer 中添加响应头?

Posted

技术标签:

【中文标题】如何在 ApolloServer 中添加响应头?【英文标题】:How to add a response header in 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;
  
);

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

【问题讨论】:

【参考方案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 确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。 我实际上还是不明白,如何从突变中设置“值”?

以上是关于如何在 ApolloServer 中添加响应头?的主要内容,如果未能解决你的问题,请参考以下文章

在Tomcat中添加响应头

在 ApiController 中添加自定义响应头

如何在 ApolloServer 中获取 req.user

如何在http请求头中添加cookie-CSDN论坛

如何通过跨域 ajax 获取响应头?

在对话窗口中使用 Glade,如何为按钮添加响应