我已经有一个jwt中间件,它可以验证令牌并将currentUser返回到React前端:
app.use(async (req, res, next) => {
const token = req.headers['authorization'];
if(token !== "null") {
try{
const currentUser = await jwt.verify(token, process.env.SECRET)
} catch {
console.error(err);
}
}
next();
});
现在,我想将逻辑集成到以下Apollo服务器中:
const app = express();
const server = new ApolloServer({
typeDefs: gql(typeDefs),
resolvers,
context: async () =>({
db,
secret: process.env.SECRET,
}),
});
app.use(cors(corsOptions));
server.applyMiddleware({ app });
最后,currentUser的值应可用于在反应前端使用。
我该如何实现?
答案 0 :(得分:0)
您可以将currentUser
添加到中间件内部的request
对象中。接下来,传递它,将其从请求复制到GraphQL上下文。然后,您可以添加currentUser
解析器,只需从上下文中返回用户即可。
您的中间件
app.use(async (req, res, next) => {
const token = req.headers['authorization'];
if(token !== "null") {
try{
req.currentUser = await jwt.verify(token, process.env.SECRET)
} catch {
console.error(err);
}
}
next();
});
您的服务器
const app = express();
const server = new ApolloServer({
typeDefs: gql(typeDefs),
resolvers,
context: ({ req }) =>({
currentUser: req.currentUser,
db,
secret: process.env.SECRET,
}),
});
app.use(cors(corsOptions));
server.applyMiddleware({ app });
和解析器
const resolvers = {
Query: {
currentUser: (parent, args, context) => context.currentUser,
...
}
}
添加相应的类型定义,您应该可以从客户端查询当前用户。
如果您需要更多信息here is a detailed tutorial,可能会有帮助。