Node.js 即使提供了正确的详细信息,用户登录也会失败

Node.js 即使提供了正确的详细信息,用户登录也会失败,node.js,Node.js,使用http端点,并尝试通过使用用户的电子邮件搜索数据库登录用户。用户密码被哈希。当提供的电子邮件不在数据库中时,它将返回200个状态码,但不包含任何信息 我已经尝试过自定义函数来检查用户obj是否为空。即使在这里,obj也不是空的。即使提供了正确的详细信息,Catch块仍在执行 Router.post("/users/login", async (req, res) => { try { const user = await User.findByCredentials(re

使用http端点,并尝试通过使用用户的电子邮件搜索数据库登录用户。用户密码被哈希。当提供的电子邮件不在数据库中时,它将返回200个状态码,但不包含任何信息

我已经尝试过自定义函数来检查用户obj是否为空。即使在这里,obj也不是空的。即使提供了正确的详细信息,Catch块仍在执行

Router.post("/users/login", async (req, res) => {
  try {
    const user = await User.findByCredentials(req.body.email, req.body.password)

    res.send(user)
  } catch (error) {
    res.status(400).send(error)
  }
})

userSchema.statics.findByCredentials = async (email, password) => {
  const user = User.findOne({ email: email })

  if (!user) {
    throw new Error("Unable to login")
  }

  const isMatch = await bcrypt.compare(password, user.password)

  if (!isMatch) {
    throw new Error("Unable to login")
  }
  return user
}

预期输出为用户。实际输出为空,状态代码为400。

您的问题似乎是由以下行引起的:

const user = User.findOne({email : email})
而且,因为您没有等待它或传递回调,它会返回一个猫鼬承诺

然后

由于您正在比较函数和字符串,因此计算结果始终为
false

!isMatch 

计算结果为true,这意味着您将始终抛出
错误(“无法登录”)

您的问题似乎是由以下行引起的:

const user = User.findOne({email : email})
而且,因为您没有等待它或传递回调,它会返回一个猫鼬承诺

然后

由于您正在比较函数和字符串,因此计算结果始终为
false

!isMatch 

计算结果为true,这意味着您将始终抛出
错误(“无法登录”)

您需要将
错误对象的内容发布到catch块内。您需要将
错误对象的内容发布到catch块内。感谢您的响应。我刚刚发现,在我发布问题后,当你说抛出不起作用时-你的意思是它从未进入
if(!isMatch)
块吗?即使(!user)它正在执行catch块,其中包含用于响应的空对象。我刚刚发现,在我发布问题后,当你说抛出不起作用时-你的意思是它从未进入
if(!isMatch)
块吗?即使(!user)它正在执行带有空obj的catch块也是如此