Я пытаюсь аутентифицировать пользователя , используя токен jwt и добавляя userId и проверку подлинности в запрос (req), как показано в файле промежуточного программного обеспечения, здесь req.isAuth возвращает true .
Проблема в том, что тот же req равен undefined в Resolver of Graphql, из-за чего дальнейшее использование API не предоставляется.
Буду признателен за любую помощь.
Спасибо
app. js
const express = require('express');
const bodyParser = require('body-parser');
const graphqlHttp = require('express-graphql');
const mongoose = require('mongoose');
const isAuth = require('./middleware/is-auth');
const graphQlSchema = require('./graphql/schema/index');
const graphQlResolvers = require('./graphql/resolvers/index');
const app = express();
app.use(bodyParser.json());
app.use(isAuth);
app.use((req, res, next)=>{
console.log(req);
res.setHeader('Access-Control-Allow-Origin','*');
res.setHeader('Access-Control-Allow-Methods', 'POST,GET,OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type,Authorization');
if (req.method === 'OPTIONS'){
return res.sendStatus(200);
}
next();
});
app.use('/graphql', graphqlHttp({
schema: graphQlSchema,
rootValue: graphQlResolvers,
graphiql: true
}));
mongoose.set('useCreateIndex', true);
mongoose.connect(`mongodb+srv://user:password@clusterName.mongodb.net/project-name?retryWrites=true&w=majority`, { useNewUrlParser: true, useUnifiedTopology: true }).then(() =>{
app.listen(process.env.PORT || 3002);
}).catch(err => {
console.log(err);
});
middleware is-auth. js
const jwt = require('jsonwebtoken');
module.exports = (req, res, next) => {
const authHeader = req.get('Authorization');
if(!authHeader){
req.isAuth = false;
return next();
}
const token = authHeader.split(' ')[1];
if(!token || token === ''){
req.isAuth = false;
return next();
}
let decodedToken;
try {
decodedToken = jwt.verify(token, 'supersecret');
}catch(err){
req.isAuth = false;
return next();
}
if(!decodedToken){
req.isAuth = false;
return next();
}
req.isAuth = true;
req.userId = decodedToken.userId;
console.log(req.isAuth); // returns TRUE
next();
}
GraphQl-Resolver
const User = require('../../models/user');
const Post = require('../../models/post');
const Comment = require('../../models/comment');
const jwt = require('jsonwebtoken');
module.exports = {
fetchPosts: async (req) => {
console.log(req.isAuth); // This returns Undefined
if(!req.isAuth){
throw new Error("Not Authorised to access this feature");
}
try{
const userId = req.userId; //"5e0edd18845b912b244a1990";
const {following} = await User.findOne({_id: userId});
const postList = new Array;
await Promise.all(following.map( async eachUser => {
const {createdPosts} = await User.findOne({_id: eachUser});
await Promise.all(createdPosts.map(async eachPost => {
const postDetail = await Post.findOne({_id: eachPost});
await postList.push(postDetail);
}));
}));
return {postList};
}catch(err){
throw(err);
}
},