我设置了一个用户/登录路由来获取用户,将用户密码与哈希密码进行比较,生成 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() 的实际
获取。通常,这会告诉您导致 promise 拒绝的原因,或者至少告诉您在哪里进一步查找。err
。 catch()
如果您在服务器上登录时遇到问题,您还可以在发送回客户端的响应消息中添加更多信息,并在那里获取信息。
仅供引用,您还有另一个问题。当您在 .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/