【问题标题】:How NOT to send back a response to ajax post call in node.js?如何不在 node.js 中发回对 ajax post 调用的响应?
【发布时间】:2019-05-11 09:34:17
【问题描述】:

我有一个 ajax 后调用,我只想发送表单值而不等待响应。我想从我的快递应用程序重定向,而不是形成我的客户端。服务器端:

router.post("/", (req, res)=>{ 
     res.status(200).send(`signup/confirm-email?v=${req.body.email}`);
     // i want to be able to rediect with res.redirect("signup/confirm-email?v=${req.body.email}")
     }; 
});

客户端:

    $.post('/signup', $('#signup-form-container form').serialize())
 .done(lnk=>{
       window.location.replace(`${window.location}${lnk}`); })
 .fail(function(xhr){ //handle errors };

上面的代码有效,它向 ajax 发送响应,然后我从客户端重定向。 我想从服务器端重定向。 我尝试使用 res.redirect() 从我的 express 应用程序重定向,但如果没有将任何错误记录到控制台和开发工具的网络选项卡中,它就无法工作,它显示请求类型是 xhr。如果这个问题没有解决方案,那么有没有办法在收到的路由中隐藏查询。我不希望v=${req.body.email} 显示在网址栏中。提前谢谢你。

【问题讨论】:

    标签: javascript node.js ajax express redirect


    【解决方案1】:

    Ajax 的重点是请求由 JavaScript 发出,响应由 JavaScript 处理。

    如果您返回重定向响应,那么 JavaScript 将跟随重定向,发出新请求并处理响应。

    如果您不想使用 JavaScript 处理响应:不要使用 Ajax。请改用常规表单提交。

    【讨论】:

    • 有没有办法在url地址栏中隐藏查询?
    • 一开始就不要把它放在那里。 (这不是您应该担心的事情,它是从浏览器发送的数据,因此用户已经可以访问它)。
    • 谢谢。但是我可以将这种数据传递给 cookie 以便用户看不到吗?
    • 你不能。 Cookie 由浏览器存储,并随每个请求从浏览器发送到服务器。浏览器属于用户,完全在他们的控制之下。他们可以随意检查和修改它存储和发送的cookie。
    • @EyePatch 是的:<form method="post">... 将发出 HTTP 请求,而不在地址栏中显示请求参数。零 javascript 必要。这就是昆汀所说的不要使用 ajax 的意思。只需正确使用 HTML 表单即可。谷歌“mdn form”了解更多
    【解决方案2】:

    避免使用 jQuery,它几乎总是会导致不良做法和无法维护的代码。

    如果你需要一个框架,你应该使用纯 Javascript 或 React(这主要是如果你需要处理一个大项目,但可能不适合所有 JS 初学者)。我的解决方案是纯 Javascript。

    作为 jQuery 请求工具($.post() 等)的替代品,浏览器有一个非常好的 HTTP 请求 API,名为 fetch (MDN)。我在这个解决方案中使用它。

    如果您不想在 URL 中显示 email 参数,您可以在 localStorage 中进行设置。

    您不能直接从 Express 重定向 POST 方法。只有当您尝试 GET 一个页面时,Express 才能重定向到另一个 GET(并因此更改浏览器中的 URL)。

    您需要的唯一解决方案是在收到来自您的/signup 端点的响应后使用window.location

    服务器端:

    router.post('/', function (req, res) {
      const form = req.body.form
      // your registration code here
      // ...
      res.json({
        success: true,
        email: form.email
      })
    })
    

    客户端: signup.js

    const form = {
      email: document.getElementById('email').value
      // add other fields you need
    }
    
    fetch('/signup', {
      method: 'POST',
      headers: {
        'Content-type': 'application/json'
      },
      body: JSON.stringify({ form })
    })
      .then(res => res.json())
      .then(res => {
        // Set the localStorage item so you can get it back
        // in the JS script of /signup/confirm-email
        localStorage.setItem('email', res.email)
    
        // Redirect to the confirm email page
        window.location = '/signup/confirm-email'
      })
    

    客户端: confirmEmail.js

    const email = localStorage.getItem('email')
    if (!email) window.location = '/signup'
    
    // proceed with your code
    

    Code for this answer

    【讨论】:

    • 这完全是我所需要的。谢谢
    • 不客气,我有一个 Discord 服务器,我们可以互相帮助,不要犹豫加入它:) discord.gg/C2bVzgb
    • @SherloxFR 你有点困惑。您建议避免使用 AJAX 并改用 Fetch API。 AJAX 代表异步 JavaScript。所以 Fetch 是一种执行 AJAX 请求的现代方式。
    • 请你告诉我 jquery 有什么问题,比如 jquery vs fetch
    • 是的,现在我正在尝试将我的 jquery 转换为 fetch。谢谢
    猜你喜欢
    • 2019-08-16
    • 2013-10-12
    • 2016-09-19
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多