Node.js 快速登录:未处理的PromisejectionWarning:未处理的承诺拒绝

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

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 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
响应。你能把日志寄出去吗?