node.js - 如何从自定义指令访问 Apollo 上下文
问题描述
我正在尝试集成一些自定义指令以检查我的应用程序中的访问权限
我尝试了很多方法来实现 apolloGrapql 自定义指令,但我总是遇到同样的问题,我无法从指令访问我的上下文函数
=> 我有什么
...imports
// graphql server
async function startApolloServer () {
class HasRole extends SchemaDirectiveVisitor {
visitObject (type) {
this.ensureFieldsWrapped(type)
type._requiredAuthRole = this.args.requires
}
visitFieldDefinition (field, details) {
this.ensureFieldsWrapped(details.objectType)
field._requiredAuthRole = this.args.requires
}
ensureFieldsWrapped (objectType) {
const fields = objectType.getFields()
Object.keys(fields).forEach(fieldName => {
field.resolve = async function (...args) {
console.log('context please', args[2])
// return {}
// can't access decodedToken()
}
})
}
}
const app = express()
const server = new ApolloServer({
schema: makeExecutableSchema({
typeDefs,
resolvers,
context: ({ req, res, next }) => {
return {
decodedToken: () => {
return getUser(req)
}
}
},
schemaDirectives: {
hasRole: HasRole
}
})
})
await server.start()
server.applyMiddleware({ app })
await new Promise(resolve => app.listen({ port: process.env.PORT }, resolve))
console.log(` Server ready at http://localhost:${process.env.PORT}${server.graphqlPath}`)
enableApiControllers(app)
return { server, app }
}
startApolloServer()
解决方案
终于找到了,
上下文不应在模式中定义,例如 =>
const server = new ApolloServer({
context: ({ req, res, next }) => {
return {
decodedToken: () => {
return getUser(req)
}
}
},
schema: makeExecutableSchema({
typeDefs,
resolvers,
schemaDirectives: {
hasRole: HasRole
}
})
})
推荐阅读
- javascript - 在 EChart 上画圆
- c# - 如果在 linq 语句 C# 中不满足值,则显示值
- shopify - 有没有办法在 Shopify (Liquid) 上的选定单选按钮上获得图像叠加?
- symfony - Symfony 5 Doctrine ORM : 从现在开始获取最近的日期
- google-apps-script - 如何更改列的背景颜色?
- javascript - 在 Web 应用程序中的牵引打印机中打印 pos 收据
- python - MainWindow 上的 TypError (self, str)
- r - 如何拆分数据帧以进行并行处理,然后重新组合结果?
- api - 邮递员:断言响应中存在多个值
- php - SilverStripe 4 / NGINX 在尝试编辑草稿页面时重定向到 404