如何不在node.js中发回对ajax调用的响应?

时间:2019-05-11 09:34:17

标签: javascript node.js ajax express redirect

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

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}显示在网址栏中。预先谢谢你。

2 个答案:

答案 0 :(得分:1)

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

如果您返回重定向响应,则JavaScript将遵循该重定向,发出新请求,然后处理对此的响应。

如果您不想使用JavaScript处理响应,请执行以下操作:不要使用Ajax 。改为使用常规表单提交。

答案 1 :(得分:0)

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

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

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

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

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

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

服务器端:

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