Экспресс-вход: предупреждение о необработанном отказе: отклонение необработанного обещания

#node.js #jwt

#node.js #jwt

Вопрос:

Добрый день, разработчики, я пытаюсь запустить процесс входа в систему для пользователей в моем приложении, генерируя токен по соображениям безопасности, но в какой-то ситуации я получаю эту ошибку

 (node:11088) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async 
function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:11088) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
  

несмотря на то, что пользователю разрешено входить в систему, но затем создается токен, который не отображается в json для входа, который я сгенерировал для целей приложения, проверенных у моего почтальона.

Допустим, я сначала запускаю процесс в своей папке генератора токенов после установки пакета jsonwebtoken

 jsonwebtoken generation folder

const jsonwebToken = require("jsonwebtoken");

const generateToken =async  (userId) => {
  return new Promise((reject, resolve) => {
    const tokenPayload = { userId };

    jsonwebToken.sign(
      tokenPayload,
      process.env.TOKEN_SECRET_WORD,
      {
        expiresIn: "12h",
      },
      (error, generatedToken) => {
        if (error) {
           reject("cant generate token");
        } else {
          resolve(generatedToken);
        }
      }
    );
  });
};
module.exports = { generateToken };
  

Как только процесс генерации токена установлен, на моем контроллере для функции LoginUser я устанавливаю это

 et User = require("../modelos/UserModel");

const { response } = require("express");

const cryptoPass = require("bcryptjs");

const { generateToken } = require("../jsonwebtoken/jsonWebTokenGenerator");//path to the json generator

const loginUser = async (request, response = response) => {
  const { userEmail, userPassword } = request.body;

  try {
    const userInDb = await User.findOne({ userEmail });

    if (!userInDb) {
      return response.status(400).json({
        ok: false,
        message: "Not user Found",
      });
    } 

    const passwordValid = await cryptoPass.compareSync(
      userPassword,
      userInDb.userPassword
    );

    if (!passwordValid) {
      return response.status(400).json({
        ok: false,
        message: "Error in Password",
      });
    }

    const tokenGenerated =  generateToken(userInDb.id);//generating the tooken in the process
                                                       //in order to add it to the user logged json
                                                       //once the response is ok(200)

    response.status(200).json({
      ok: true,
      message: "User Logged",
      tokenGenerated,//no token
    });
  } catch (error) {
      response.status(500).json({
      ok: false,
      message: "Some error happened in login",
    });
  }
};
module.exports = {
  loginUser,
};

  

Но затем, несмотря на вход пользователя в систему, токен не вводится в ответ, и появляется эта ошибка:

введите описание изображения здесь

введите описание изображения здесь

Странно, но если я использую await при присвоении идентификатора пользователя методу generate token , а затем запускаю весь процесс, тогда вход в систему не будет успешным, и console loggin перехват этой ошибки фактически возвращает мне токен:

 ......
 const tokenGenerated =await  generateToken(userInDb.id);//adding an await

    // console.log(tokenGenerated,"controller token");
    // console.log(userInDb);
    response.status(200).json({
      ok: true,
      message: "User Logged",
      tokenGenerated,
    });
  } catch (error) {
    console.log(error,"Error");//loggin the error in the catch
    response.status(500).json({
      ok: false,
      message: "Some error happened in login",
    });
  }
  

введите описание изображения здесь

и в postman неудачный вход в систему
введите описание изображения здесь

Было бы удивительно, если бы кто-нибудь помог в этом. Заранее спасибо!!

Комментарии:

1. generateToken является асинхронной функцией. Добавьте await при вызове функции.

2. если я добавляю ожидание, оно перенаправляет меня на catch, выдавая ошибку

3. Что говорит ошибка catch?

4. ошибка выводит токен, когда я его утешаю

5. Но ни один из ваших блоков catch не возвращает токен. Единственный ответ, который выполняется, — это 200 ответ. Можете ли вы опубликовать журнал?

Ответ №1:

Подпись обратного вызова в new Promise() within generateToken неверна

Вы используете

 return new Promise((reject, resolve) => {
...
});
  

но правильный

 return new Promise((resolve, reject) => {
...
});
  

т.Е. Вы переключили параметр resolve and reject . Таким образом, когда в вашем методе вы пытаетесь вызвать resolve(generatedToken); , вы фактически отклоняете свое обещание с ошибкой сгенерированного токена.