如何利用Node.js与JSON搭建简单的动态服务器
一、创建html页面
创建4个页面,index.html、register.html、sign_in.html、home.html
- index.html默认主页
- register.html用于注册账号
- sign_in.html用于登录账号
- home.html用于显示登录后的页面
主要代码片段
register.html
用户名: 密码: 注册
sign_in.html
用户名: 密码: 登录
home.html
{{loginStatus}}
你好,{{user.name}}
登录
二、Node服务器
varhttp=require('http')
varfs=require('fs')
varurl=require('url')
varport=process.argv[2]
if(!port){
console.log('请输入指定端口。如:\nnodeserver.js8888')
process.exit(1)
}
varserver=http.createServer(function(request,response){
varparsedUrl=url.parse(request.url,true)
varpathWithQuery=request.url
varqueryString=''
if(pathWithQuery.indexOf('?')>=0){
queryString=pathWithQuery.substring(pathWithQuery.indexOf('?'))
}
varpath=parsedUrl.pathname
varquery=parsedUrl.query
varmethod=request.method
/********mainstart************/
//读取session文件,转化为对象
constsession=JSON.parse(fs.readFileSync('./session.json').toString())
if(path==='/sign_in'&&method==='POST'){
//读数据库
letuserArray=JSON.parse(fs.readFileSync('./database/users.json'))
constarray=[]
//每次接受数据就添加进数组
request.on('data',(chunk)=>{
array.push(chunk)
})
request.on('end',()=>{
//转化字符串
conststring=Buffer.concat(array).toString()
//在转化为对象
constobj=JSON.parse(string)
//找到符合的user
constuser=userArray.find(user=>user.name===obj.name&&user.password===obj.password)//成功返回符合的对象,失败返回undefined
if(user===undefined){//失败
response.statusCode=400
response.setHeader('content-Type','text/JSON;charset=UTF-8')
response.end(`{"errorCode":4001}`)
}else{//成功
response.statusCode=200
//设置Cookie
constrandom=Math.random()
session[random]={
user_id:user.id
}
//写入数据
fs.writeFileSync('./session.json',JSON.stringify(session))
response.setHeader("Set-Cookie",`'session_id=${random};HttpOnly'`)
response.end()
}
})
}elseif(path==='/home.html'){
//获取Cookie
constcookie=request.headers['cookie']
letsessionId
try{//读取Cookie中的id值
sessionId=cookie.split(';').filter(s=>s.indexOf('session_id=')>=0)[0].split('=')[1]
}catch(error){}
if(sessionId&&session[sessionId]){
//从session中读取对应的值
constuserId=session[sessionId].user_id
//读数据库
letuserArray=JSON.parse(fs.readFileSync('./database/users.json'))
//找到符合的user
letuser=userArray.find(user=>user.id===userId)
consthomeHtml=fs.readFileSync('./public/home.html').toString()
letstring
if(user){
string=homeHtml.replace('{{loginStatus}}','已登录').replace('{{user.name}}',user.name)
response.write(string)
}
}else{
//读取源文件内容
consthomeHtml=fs.readFileSync('./public/home.html').toString()
//替换文字
conststring=homeHtml.replace('{{loginStatus}}','未登录').replace('{{user.name}}','')
response.write(string)
}
response.end()
}elseif(path==='/register'&&method==='POST'){
response.setHeader('Content-Type','text/html;charset=UTF-8')
//readdatabase
letuserArray=JSON.parse(fs.readFileSync('./database/users.json'))//readdatabase
constarray=[]
request.on('data',(chunk)=>{
array.push(chunk)
})
request.on('end',()=>{
//convertstring
conststring=Buffer.concat(array).toString()
//convertobj
constobj=JSON.parse(string)
//lastuserid
constlastUser=userArray[userArray.length-1]
//newuser
constnewUser={
id:lastUser?lastUser.id+1:1,
name:obj.name,
password:obj.password
}
userArray.push(newUser)
//writedata
fs.writeFileSync('./database/users.json',JSON.stringify(userArray))
})
response.end()
}else{
response.statusCode=200
letcontent
//settingindex
constfilePath=path==='/'?'/index.html':path
//judgetype
constindex=filePath.lastIndexOf('.')
constsuffix=filePath.substring(index)
constfileType={
'.html':'text/html',
'.css':'text/css',
'.js':'text/javascript'
}
response.setHeader('Content-Type',`${fileType[suffix]||"text/html"};charset=utf-8`)
try{
content=fs.readFileSync(`./public${filePath}`)
}catch(error){
content='文件路径不存在'
response.statusCode=404
}
response.write(content)
response.end()
}
/********mainend************/
})
server.listen(port)
console.log('监听'+port+'成功!请输入下列地址访问\nhttp://localhost:'+port)
三、主要思路
register.html
使用jQuery的ajax将数据发送请求/register给后端,成功则跳转到sign_in.html
数据需要使用JSON.stringify转化为字符串在提交
/register
读取users.json的数据,创建一个空数组,将传递过来的参数push进去。将数组转换为字符串,在转换为对象。
获取数据库中最小的id值,将数据组成新的对象,添加进入数据库中。
sign_in.html
使用ajax将数据发送请求/sign_in给后端,成功则跳转home.html
/sign_in
读取users.json的数据,创建一个空数组,将传递过来的参数push进去。将数组转换为字符串,在转换为对象。
在读取后的数据库中,查找有没有符合条件的user,成功返回读取后的对象,失败返回undefined。
如果成功,设置随机数,将随机数的值与user的id绑定。并添加到session.json中。然后setHeader,将cookie发送到浏览器。
/home
获取登入成功后cookie的值。读取session中对应的随机数。如果随机数和session对应的随机数值存在,就显示已登录,否则显示未登录
总结
到此这篇关于如何利用Node.js与JSON搭建简单的动态服务器的文章就介绍到这了,更多相关Node.js与JSON搭建动态服务器内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!