最近在改进之前做的登录注册功能,最开始做的时候是用的form表单提交将用户输入的账号密码提交到服务端。
服务端根据数据处理完之后进行判断,如果在数据库中能够查询到对应的值,则会从登陆页面跳转到首页;如果在数据库中不能查询到对应的值,则依旧会停留在注册页面并提示错误信息。
此过程页面的跳转恰好用的是res.render的方式,搭配上ejs模板引擎实现了页面的渲染。
res.render('login',{msg:'登录失败!用户名或密码错误!',user:0,playlists:req.playlists,modify_informations:req.modify_informations,lastplay:req.lastplay})
完后这个功能之后,自己觉得还可以优化一下。因为从特性上将,表单具有默认的提交行为,默认是同步的,即同步表单提交,浏览器会锁死(转圈… …),等待服务端的响应结果。
同步表单提交,浏览器会直接将服务端响应内容,直接渲染到客户端浏览器所谓的(页面容器中)。因此,同步请求返回结果,无论是什么,浏览器都会进行显示覆盖。
并且如果用户输错了账号密码,输入框里面的信息就会被清空,不得不使得用户重头到尾再输入一遍,如果遇到了需要填写数据比较多的情况,这是极其不利于用户体验的。
考虑到同步请求有那么多的弊端,所以自己想要把登录注册原先的表单提交改成ajax异步请求(formdata),但问题也随之出现了,我发现服务端的res.render竟然不起作用了,根本渲染不了指定的页面,而且在服务端竟然还没有报错。
当时一直找不到原因,明明那一行代码自己并没有动过,所以根本不知道自己到底错在了哪里。
var formData = new FormData(document.getElementById('register_form'))
var xhr = new XMLHttpRequest()
xhr.open('post',"/register")
xhr.send(formData)
xhr.onload = function() {
var err_code = JSON.parse(xhr.responseText).err_code
if(xhr.status == 200&&err_code == 1) {
window.location.href = '/login'
}else if(xhr.status == 200&&err_code == 0) {
window.alert('注册失败')
}
}
经过在网上周旋了一番,才找到真正的原因:原来服务端重定向针对客户端的异步请求是无效的。这才恍然大悟!
最后在代码中改进了一下,使用域名url来跳转页面才把问题给解决:
window.location.href = '/login'