Функция jwt.verify ничего не возвращает, и API не может получить никакого ответа

Файл App.js

const express = require('express');
const bodyParser = require('body-parser');
const graphqlHttp = require('express-graphql');
const { buildSchema } = require('graphql');
const isAuth =  require('./middleware/is-auth');
var mysql      = require('mysql');

const app = express();
const jwt = require('jsonwebtoken'); 

var connection = mysql.createConnection({
host     : 'localhost', //mysql database host name
user     : 'root', //mysql database user name
password : '', //mysql database password
database : 'test' //mysql database name
});

connection.connect(function(err) {
if (err) throw err
console.info('You are now connected with mysql database...')
})


app.use(bodyParser.json());

app.use(isAuth);

app.use(
 '/graphql',
   graphqlHttp({
    schema: buildSchema(`
       type users {
         id: String!
         username: String!
         password: String!
         role: String!
         name: String!
         photo: String!
        }
       type AuthData
       {
      userID: String!
      token: String!
      tokenExpiration: Int!
    }
    type RootQuery {
        getUsers: [users!]!
        login(username: String!, password:  String!): AuthData! 
    }
    type RootMutation {
      createUsers(name: String): String
    }
    schema {
        query: RootQuery
        mutation: RootMutation
    }
`),
rootValue: {
  login: async ({username,password}) =>  {




    return new Promise((resolve, reject) => {
      connection.query('select * from users where username = "'+username+'"', (error, results, fields) => {
        if (error) {
          reject(error)
        } else {
          resolve(results);
        }
      })
    }).then(function(result) {
      const users =  result;

    if (!users || users[0] == null)
    {
      throw new Error('User does not exist')
    }
    const token = jwt.sign({userID: users[0]['id'], username: users[0]['username']}, 'SomeSuperSecretKey', {
       expiresIn: '1h'
    });
    return { userID: users[0]['id'], token, token,tokenExpiration: 1}
  })
  },
  getUsers: async (req) => {

    if (!req.isAuth)
    {
      throw new Error('Unauthenticated');
    }
    // Note, we have to return the Promise here
    return new Promise((resolve, reject) => {
      connection.query('select * from users', (error, results, fields) => {
        if (error) {
          reject(error)
        } else {
          // Don't stringify
          resolve(results)
        }
      })
    })
  },

},
graphiql: true
})
);

app.listen(3000);

Файл is-auth.js

const jwt  = require ('jsonwebtoken');

module.exports = (req, res, next) => {
   const authHeader = req.get('Authorization');
   if (!authHeader){
      console.info("Here");
      req.isAuth = false;
      return next();
    }
   const token = authHeader.split(' ')[1]; // bearer tokenValue 

   if (!token || token === ''){
      console.info("Here1");
      req.authHeader = false;
      return next();
   }

   let decodedToken;
   try
   {
      console.info(token);
      decodedToken = jwt.verify(token, 'SomeSuperSecretKey'); //same key used in app.js

   }catch(err){
      console.info(err);
      req.isAuth = false;
      return next(); 
   }

  if (!decodedToken){
      req.isAuth = true;
      req.userID = decodedToken.userID;
      return next(); 
  }

}

Почтальон Апи

Функция jwt.verify не возвращает ничего, что она застряла, и API не дает ответа. Так что проблема в функции проверки, в которой она застряла. И если я ввожу собственный пользовательский токен, он выдает другую ошибку, в которой говорится, что вам не разрешено вводить свой собственный пользовательский токен, только можно использовать токены, сгенерированные jwt.

В самом конце вашего примера кода я вижу две вещи: (1) вы устанавливаете req.isAuth = true только в случае, когда jwt.verify возвращает ложное значение; и (2) если последнее условное выражение не выполняется, ваша промежуточная функция не вызывает next() и не выдает ответ на res. Добавление дополнительных операторов console.info, чтобы проверить, как далеко вы на самом деле продвинулись, также поможет вам в отладке.

David Maze 18.02.2019 13:09

разобрался, да, это была ошибка, и еще одна ошибка была в файле app.js, где req — второй параметр, а я принимал его как 1-й параметр.

Sheikh Abbas 18.02.2019 14:33
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
563
0

Другие вопросы по теме