我开始使用GraphQL Modules,它们引入了中间件的概念,您可以在其中应用不同的级别。
我为我的整个应用程序配置了一个中间件,像这样要求身份验证:
export const modularApp = createApplication({
modules: [customerModule, premiumModule],
middlewares: {
"*": {
"*": [authMiddleware],
},
},
});
export function authMiddleware({ root, args, context, info }, next) {
if (context.authenticated) {
throw new AuthenticationError("Unauthorized");
}
return next();
}
但是,我想绕过一些查询和突变authMiddleware
,因为它们是公开的。我认为在模块级别添加它们会覆盖应用程序中间件:
export default createModule({
id: 'customer-module',
dirname: __dirname,
typeDefs,
resolvers,
middlewares: {
'Query': {
'somePublicOperation': [publicMiddleware],
}
},
});
export function publicMiddleware({ root, args, context, info }, next) {
// bypass authMiddleware
return next();
}
两个中间件都被执行了,所以我想不出这个问题的解决方案。
我可以将authMiddleware
单独添加到操作中,但这不是非常可扩展的,因为大多数操作都需要身份验证。另一个想法是为公共/受保护的操作创建单独的模块,但我不确定性能影响是什么,因为两者都依赖于相同的类型。