我有这个中间件,需要让当前用户在阿波罗服务器的上下文中进行设置
app.use(async (req, res, next)=>{
const token = req.headers['authorization'];
if(token !== "null"){
try {
const currentUser = await jwt.verify(token, process.env.SECRET)
req.currentUser = currentUser;
} catch (error) {
console.log(error);
}
}
next()
})
,并且需要在上下文中设置当前用户
const SERVER = new ApolloServer({
schema,
context:{
currentUser //need to set this current user
}
})
SERVER.applymiddleware({app})
答案 0 :(得分:1)
Apollo服务器中的上下文api提供如下处理请求
const initGraphQLserver = () => {
const graphQLConfig = {
context: ({ req, res }) => ({
user: req.user,
}),
rootValue: {},
schema,
};
const apolloServer = new ApolloServer(graphQLConfig);
return apolloServer;
};
这将假定您将具有正确的中间件来解析cookie或标头。这取决于您的身份验证机制,因为您需要在某些中间件中为请求设置用户,如果您想使用JWT,则可以使用例如该中间件
const auth = (req, res, next) => {
if (typeof req.headers.authorization !== 'string') {
return next();
}
const header = req.headers.authorization;
const token = header.replace('Bearer ', '');
try {
const jwtData = jwt.verify(token, JWT_SECRET);
if (jwtData && jwtData.user) {
req.user = jwtData.user;
} else {
console.log('Token was not authorized');
}
} catch (err) {
console.log('Invalid token');
}
return next();
};
如果jwt令牌正确,此中间件将注入用户,然后在您的服务器文件中,您将需要具有以下顺序的中间件
const app = express();
app.use(auth);
initGraphQLserver().applyMiddleware({ app });
现在,您应该在架构上下文中拥有用户。我希望很清楚,代码尚未完成,但是应该易于完成所有工作。