Запрос не определен в Graphql Resolver, но содержит некоторое значение в Middleware. (Узел Express) - PullRequest
0 голосов
/ 09 января 2020

Я пытаюсь аутентифицировать пользователя , используя токен 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);
        }

    },

1 Ответ

0 голосов
/ 09 января 2020

Я сам решил это.

Проблема возникает при передаче просто req в качестве аргумента.

Решение:
Передача обоих args и req решили проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...