Node.js 快速登录:未处理的PromisejectionWarning:未处理的承诺拒绝
Good day开发者我正在尝试为我的应用程序中的用户触发一个登录过程,出于安全原因生成一个令牌,但是在某些情况下我收到了这个错误Node.js 快速登录:未处理的PromisejectionWarning:未处理的承诺拒绝,node.js,jwt,Node.js,Jwt,Good day开发者我正在尝试为我的应用程序中的用户触发一个登录过程,出于安全原因生成一个令牌,但是在某些情况下我收到了这个错误 (node:11088) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting
(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包之后,首先在token generator的文件夹中启动该过程
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,
};
但是,尽管登录了用户,但响应中没有引入令牌,并且出现了错误:
这很奇怪,但如果我在将用户id指定给generate token方法时使用wait,然后触发所有过程,则登录不成功,并且控制台登录该错误的捕获实际上为我带来了令牌:
......
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",
});
}
而在邮递员中,登录不成功
在这方面有任何帮助都会令人惊讶。提前谢谢 在
generateToken
中的new Promise()
中的回调签名错误
您正在使用
return new Promise((reject, resolve) => {
...
});
但正确的答案是
return new Promise((resolve, reject) => {
...
});
也就是说,您切换了
resolve
和reject
参数。因此,当您在方法中尝试调用resolve(generatedToken)
您实际上拒绝了您的承诺,生成的令牌出现了错误。generateToken
是异步函数。调用函数时添加await
。如果我添加了一个await,它会将我重定向到catch,从而暴露错误catch错误说明了什么?当我控制台时,错误会带来令牌,但是,您的catch块都不会返回令牌。唯一的响应是200
响应。你能把日志寄出去吗?