我有一个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}
显示在网址栏中。预先谢谢你。
答案 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