首先写一个登录界面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<title>Document</title>
</head>
<body>
<form id="signUpForm">
<div class="form-wrapper">
<h1>注册</h1>
<div class="row">
<label for="">昵称</label>
<input type="text" name="dub">
</div>
<div class="row">
<label for="">邮箱</label>
<input type="text" name="email">
</div>
<div class="row">
<label for="">密码</label>
<input type="text" name="password">
</div>
<div class="row">
<input type="submit" name="提交">
</div>
</div>
</form>
<script>
let hash={}
$()
</script>
<style>
*{margin:0;padding:0;}
*{box-sizing: border-box;}
body{
display:flex;
min-height:100vh;
justify-content:center;
align-items:center;
flex-direction: column;
}
.form-wrapper{
border:1px solid #ddd;
padding:20px;
min-width:350px;
}
.form-wrapper>.row{
margin:10px 0;
}
.form-wrapper > .row>label{
display: inline-block;
width:4em;
}
</style>
</body>
</html>
那我们怎么拿到表单提交的数据呢
监听表单提交事件,然后把数据存放在生成的哈希里
<script>
let hash={}
$('#signUpForm').on('submit',(e)=>{
e.preventDefault()
let need = ['dub','email','password']
need.forEach((name)=>{
console.log(name)
let value = $('#signUpForm').find(`[name=${name}]`).val()
hash[name]= value
})
console.log(hash)
})
</script>
$.post('/sign-up',hash) //
.then(()=>{
console.log('success')
},()=>{
console.log('fail')
})
$.post()方法使用HTTP POST请求从服务器加载数据
$(selector).post(URL,data,function(data,status,xhr),dataType)
data是连同请求发送到服务器的数据
服务器拿到请求的数据
let body = []
request.on('data',(chunk)=>{
body.push(chunk)
}).on('end',()=>{
body = Buffer.concat(body).toString()
console.log(body)
response.statusCode=200
reaponse.end()
})
//dub=25&email=18767188399&password=6
我们要先把拿到的这个字符串变成一个哈希对象
let strings = body.split('&')
let hash = {}
strings.forEach((string)=>{
let parts = string.split('=')
let key = parts[0]
let value = parts[1]
hash[key]=value
})
console.log(hash)
//{ dub: '25', email: '18767188399', password: '6' }
接着把这个对象里面的属性变成一个个变量,这里用到ES6里面的解构赋值
let {dub,email,password}=hash
检查变量email里面有没有@符号,如果有就返回200,如果没有就返回400,并返回"email is bad"
if(email.indexOf("@") === -1){
response.statusCode = 400
response.setHeader('Content-Type', 'application/text;chraset:utf-8')
response.write('email is bad')
}else{
response.statusCode = 200
}
}
这边浏览器的ajax的then函数可以写成
$.post('/sign-up',hash) //
.then((response) => {
console.log(response)
}, (request) => {
if(request.responseText === 'email is bad'){
alert('邮箱写错了')
}
})
成功时打印响应,失败如果响应的文字是“email is bad”,就弹出“你邮箱写错了”
这样有一个问题就是,如果前端的代码里面多写一个空格,可能就失效了。比较好的方法是后端给前端返回一个JSON字符串,然后前端再解析这个字符串。
response.write(`{
"errors":{"email":"invalid"}
}`)
$.post('/sign-up',hash) //
.then((response) => {
console.log(response)
}, (request) => {
let object = JSON.parse(request.responseText)
let {errors} = object
console.log(errors)
})
也可以用另一种方法,就是在响应里设置一个JSON格式的响应头,就可以自动把JSON对象变成对象
response.setHeader('Content-Type', 'application/json;chraset:utf-8')
(request) => {
let {errors} = request.responseJSON
console.log(errors)
if(errors.email && errors.email === "invalid"){
alert('你邮箱输错了')
}
})
那么如果用户可能没有输入就点提交,所以要在post之前检查一下是否为空,
if(hash['email'] === ''){
$form.find("[name='email']").siblings('.error').text('填邮箱呀')
return
}
if(hash['dub'] === ''){
$form.find("[name='dub']").siblings('.error').text('填昵称呀')
return
}
if(hash['password'] === ""){
$form.find("[name='password']").siblings('.error').text('填密码呀')
return
}
我们需要同一时间只显示一个提示,需要一开始把提示都清空
$form.find('.error').each((index, span) => {
$(span).text('')
})
信息全都正确之后,后台要把这个注册信息存到数据库
else{
var users = fs.readFileSync("./db/users",'utf8')
var lei = typeof(users)
console.log(lei) //string
users = JSON.parse(users) // arry
users.push({ email: email, password: password }) //push对象到数组里面
var stringUsers = JSON.stringify(users) //arry再变成字符串
fs.writeFileSync('./db/users', stringUsers)
}
数据库里面是个JSON语法的字符串(“[]”)先经过解析成一个数组,然后把对象push进去,在变成字符串写进数据库里
但是这样会数据存储会重复,先判断一下是否存在,再push
let inUse = false
for (let i = 0; i < users.length; i++) {
let user = users[i]
if (user.email === email) {
inUse = true;
break;
}
}
if (inUse) {
response.statusCode = 400
response.write('email is bad')
} else {
users.push({ email: email, password: password }) //push对象到数组里面
var stringUsers = JSON.stringify(users) //arry再变成字符串
fs.writeFileSync('./db/users', stringUsers)
response.statusCode =200
}
这样注册就做完了,完成的需求有,提醒用户输入内容,检测邮箱格式,检测数据库中是否已经存在重复用户,符合条件后存储进数据库,
接着来做一个登录界面
首先写一个登录界面,样式和注册界面相同,后端还是先拿到post表单的数据,然后再拿去和数据库比对,如果找到注册,那么就跳转到主页,如果不成功那么就弹出提示“邮箱与密码不匹配”
sign-in里的Ajax post请求
$.post('/sign-in', hash) //
.then((response) => {
window.location.href = './'
}, (request) => {
alert('邮箱与密码不匹配')
})
后端按照之前的方法拿到POST信息之后,读取数据库,然后进行比对,如果密码和邮箱都符合,那么就返回200,否则返回401,然后Ajax对应的访问主页或者弹出错误提示。
var users = fs.readFileSync("./db/users", 'utf8')
try {
users = JSON.parse(users) //把字符串转换成数组
} catch (exception) {
users = []
}
let found
for(let i=0;i<users.length;i++){
if(users[i].email === email &&users[i].password === password){
found = true
break;
}
}
if(found){
response.setHeader('Set-Cookie',`sign_in_email = ${email}`)
response.statusCode = 200
}else{
response.statusCode = 401
}
response.end()
这样我们就实现了,当登录信息存在于数据库时跳转到主页,但是这样子就算我们没有登录,也可以输入主页的url来访问主页,接着来实现登陆之后才能访问主页的功能。
当后端找到注册信息返回200的同时,返回一个Cookie
response.setHeader('Set-Cookie',`sign_in_email = ${email}`)
接着配置主页的路由,
let cookies = request.headers.cookie.split(';')
let hash={}
for(let i=0;i<cookies.length;i++){
let parts = cookies[i].split('=')
let key = parts[0]
let value = parts[1]
hash[key]= value
}
console.log(hash)
拿到Cookie的数据,然后把它存到一个哈希对象里。然后拿Cookie里面的email去和数据库里的注册信息比较,如果找到了,就显示在主页上
else if (path == '/') {
let string = fs.readFileSync('./main.html', 'utf-8')
let cookies = request.headers.cookie.split(';')
let hash={}
for(let i=0;i<cookies.length; i++){
let parts = cookies[i].split('=')
let key = parts[0]
let value = parts[1]
hash[key] = value
}
let email = hash.sign_in_email
let users = fs.readFileSync('./db/users','utf8')
users = JSON.parse(users)
let foundUser
for(let i=0;i<users.length;i++){
if(users[i].email === email){
foundUser =users[i]
break;
}
}
console.log(foundUser)
if(foundUser){
string = string.replace('__password__',foundUser.password)
}else{
string = string.replace('__password__','不知道')
}
response.setHeader('Content-Type', 'text/html; charset=utf-8')
response.write(string)
response.statusCode = 200
response.end()
} else {
response.statusCode = 404
response.end()
}