#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);
, вы фактически отклоняете свое обещание с ошибкой сгенерированного токена.