javascript - 登录系统在 Postman 中正常工作,但在浏览器中不正常

标签 javascript node.js mongodb mongoose postman

这是我的路由器

 router.post("/login", async (req, res) => 
    {
        try
        {
            const user = await User.findByCredentials(req.body.email, req.body.password)  
            // console.log(user)
            const token = await user.generateAuthToken()
            // console.log(token)
            res.redirect("/takvim")
        }
        catch(e)
        {
            res.status(400).redirect("/")
        }
    })

这是我在上面的函数中使用的用户模型

UserSchema.methods.generateAuthToken = async function () 
{
    const user = this
    const token = jwt.sign({_id: user._id.toString()}, "secret")
    user.tokens = user.tokens.concat({token})
    await user.save()
    return token
}

UserSchema.statics.findByCredentials =  async function (emails, passwords)
{    
  const user = await User.findOne({email: emails})
  console.log(user)
  const isMatch = await bcrypt.compare(passwords, user.password)
  if(!isMatch)
  {
    throw new Error("unable to login")
  }
  return user   
}

我正在使用按钮从前端发出请求

$uyeolForm.addEventListener("submit", () => 
{
    if(!$uyeolFormEmail.value.includes(".com"))
    {
       return $uyeolFormHata.innerHTML = "email geçersiz" 
    }
    const xhr = new XMLHttpRequest();
    let form = JSON.stringify({
    email: $uyeolFormEmail.value,
    password: $uyeolFormPassword.value
    });
    xhr.open("POST", "/login")
    xhr.setRequestHeader('Content-type', 'application/json')
    xhr.send(form);
})

问题是当我使用 postman 时,应用程序将我重定向到我想要的页面并且没有给出错误。 当我使用按钮发送请求时,它仍然会找到用户,但它不会将我重定向到我期望的页面,并且在控制台中我看到了用户(预期)和 null 这不是预期的。

谢谢大家。

最佳答案

submit 时,您正在使用 XMLHttpRequest 发出 HTTP 请求事件已触发,但您并未阻止表单提交的默认行为。

因此 XMLHttpRequest 对象被创建并发出请求,然后立即(并且可能取消请求取决于事情进展的速度)<form>提交到 action 中指定的 URL .

您说端点被命中两次,一次是在您获得预期用户的地方,一次是在您没有的地方。

当您获得用户时,您期望它来自 XHR 提交。

如果你不这样做,那是来自常规表单提交(它不会被 JSON 编码,因为 HTML 表单不支持 JSON 编码,所以它找不到用户,因为它没有解码数据表格正确)。


既然您说过要重定向,请不要使用 Ajax。 Ajax 是一种在不离开当前页面的情况下发出 HTTP 请求的方法。

更改服务器端代码以接受 <form> 格式的数据正在对其进行编码(可能是 application/x-www-form-urlencoded,除非您使用 enctype 属性更改了它)。

关于javascript - 登录系统在 Postman 中正常工作,但在浏览器中不正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62734141/

相关文章:

node.js - SequelizeDatabaseError : SQLITE_ERROR: no such table: Users

mongodb - Mongoose/MongoDB 副本集使用辅助读取

javascript 奇怪的语法 : c. name=i+ +new Date;

javascript - 来自 python 对象的 JSON 编码?

node.js - 在 sails js 和 mongodb 中不同

mongodb - 我怎样才能排序空值在 mongodb 中是最后排序的?

mongodb - 如何在 fedora 23 上安装 mongodb

javascript - 防止 Firefox 中的默认 Tab 键行为

javascript - Bootstrap 3 - 如何在点击时淡入警告框并在 3 秒后淡出

node.js - 运行docker容器时找不到npm命令错误