如何在 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 中添加响应头?的主要内容,如果未能解决你的问题,请参考以下文章