javascript - 我在尝试登录我的应用程序时不断收到 401 错误

标签 javascript node.js

我设置了一个用户/登录路由来获取用户,将用户密码与哈希密码进行比较,生成 token ,然后将 token 发送到前端,但由于某种原因,我不断收到 401 错误在前端的控制台中,它最终出现在我的最后一个 catch block 中。

我尝试过控制台将其记录下来,它会显示“hello”,但不会进入第一个 .then() ,这令人困惑。而且它有时似乎可以在本地工作,但在我的 Heroku 服务器上却永远无法工作。

app.post("/user/login", (req, res, next) => {
  console.log('hello')
  let fetchedUser;
  User.find({ email: req.body.email }).then(user => {
      if (!user) {
        return res.status(401).json({
          message: "Auth failed1"
        });
      }
      fetchedUser = user[0];
      console.log('req.body.password', req.body.password)
      console.log('user password', user.password)
      return bcrypt.compare(req.body.password, user[0].password);
    }).then(result => {
      if (!result) {
        return res.status(401).json({
          message: "Auth failed2"
        });
      }
      const token = jwt.sign(
        { email: fetchedUser.email, userId: fetchedUser._id },
        process.env.JWT_SECRET,
        { expiresIn: "1h" }
      );
      console.log(token);
      res.status(200).json({
        token: token,
        expiresIn: 3600
      });
    })
    .catch(err => {
      return res.status(401).json({
        message: "AUTH FAILED 3"
      });
    });
});

我希望用户在使用此路径后登录,但它在最后一个 catch block 中抛出错误。它甚至不会进入我的 Heroku 服务器上的 console.log('hello') 。

最佳答案

要找出实际导致其进入 .catch() 的原因,您需要找到一种方法来记录 .catch() 的实际 err。 catch() 获取。通常,这会告诉您导致 promise 拒绝的原因,或者至少告诉您在哪里进一步查找。

如果您在服务器上登录时遇到问题,您还可以在发送回客户端的响应消息中添加更多信息,并在那里获取信息。

仅供引用,您还有另一个问题。当您在 .then() 内执行 return res.status(401).json({ message: "Auth failed1"}); 时,这将向解释器发送到下一个 .then() 处理程序,这不是您想要的。

您可以通过执行 throw someError 并将所有 401 响应发送到您的 .catch() 来简化代码,您可以在其中一个地方发送 401 响应。这将导致它跳过其他 .then() 处理程序,这正是您想要的。

关于javascript - 我在尝试登录我的应用程序时不断收到 401 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58635976/

相关文章:

javascript - 如何使用 React+Redux 重试 promise 的 API 调用?

javascript - 如何在 React 16.9 中静音或修复控制台警告?

javascript - Flexslider rtl滑动方向问题

javascript - 忽略 Node JS 上已完成函数的异常

JavaScript - 使用 require 读取 JSON 文件给出的结果与 fs.readFileSync 不同

node.js - Mongoose 过滤后提取第一个子数组元素

javascript - 响应式全宽 Wordpress 帖子图片

javascript - 正则表达式,如果前面没有符号则获取序列

node.js - NodeJS 异步。在对象正确形成之前发送的 header

node.js - 在 Azure Web 应用程序上运行 Node.js