如何利用Node.js与JSON搭建简单的动态服务器


Posted in Javascript onJune 16, 2020

一、创建html页面

创建4个页面,index.html、register.html、sign_in.html、home.html

  • index.html 默认主页
  • register.html 用于注册账号
  • sign_in.html 用于登录账号
  • home.html 用于显示登录后的页面

主要代码片段

register.html

<form id="registerForm">
 <div>
  <label for="">用户名:<input type="text" name="name" id=""></label>
 </div>
 <div>
  <label for="">密码:<input type="password" name="password" id=""></label>
 </div>
 <div>
  <button type="submit">注册</button>
 </div>
</form>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
let $form = $('#registerForm')
$form.on('submit', (e) => {
 e.preventDefault()
 const name = $form.find("input[name=name]").val()
 const password = $form.find('input[name=password').val()
 console.log(name, password)
 // pass AJAX post data
 $.ajax({
  method: 'post',
  url: '/register',
  contentType: 'text/json; charset=UTF-8',
  data: JSON.stringify({
   name, // name: name 
   password // password: password
  })
 }).then(() => {
  alert('注册成功')
  location.href = '/sign_in.html'
 }, () => {})
})
</script>

sign_in.html

<form id="signInForm">
 <div>
  <label for="">用户名:<input type="text" name="name" id=""></label>
 </div>
 <div>
  <label for="">密码:<input type="password" name="password" id=""></label>
 </div>
 <div>
  <button type="submit">登录</button>
 </div>
</form>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
 let $form = $('#signInForm')
 $form.on('submit', (e) => {
  e.preventDefault()
  // get name password
  const name = $form.find("input[name=name]").val()
  const password = $form.find('input[name=password').val()
  // pass AJAX post data
  $.ajax({
   method: 'POST',
   url: '/sign_in',
   contentType: 'text/json; charset=UTF-8',
   data: JSON.stringify({
    name,
    password
   })
  }).then(() => {
   alert('登录成功')
   location.href = '/home.html'
  }, () => {})
 })
</script>

home.html

<p>
 {{loginStatus}}
</p>
<p>
 你好,{{user.name}}
</p>
<p>
 <a href="sign_in.html">登录</a>
</p>

二、Node服务器

var http = require('http')
var fs = require('fs')
var url = require('url')
var port = process.argv[2]

if (!port) {
 console.log('请输入指定端口。如:\nnode server.js 8888')
 process.exit(1)
}

var server = http.createServer(function (request, response) {
 var parsedUrl = url.parse(request.url, true)
 var pathWithQuery = request.url
 var queryString = ''
 if (pathWithQuery.indexOf('?') >= 0) {
  queryString = pathWithQuery.substring(pathWithQuery.indexOf('?'))
 }
 var path = parsedUrl.pathname
 var query = parsedUrl.query
 var method = request.method

 /******** main start ************/
 // 读取 session 文件,转化为对象
 const session = JSON.parse(fs.readFileSync('./session.json').toString())

 if (path === '/sign_in' && method === 'POST') {
  // 读数据库
  let userArray = JSON.parse(fs.readFileSync('./database/users.json'))
  const array = []
  // 每次接受数据就添加进数组
  request.on('data', (chunk) => {
   array.push(chunk)
  })
  request.on('end', () => {
   // 转化字符串
   const string = Buffer.concat(array).toString()
   // 在转化为对象
   const obj = JSON.parse(string)
   // 找到符合的 user
   const user = 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
    const random = 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()
   }
  })
 } else if (path === '/home.html') {
  // 获取 Cookie
  const cookie = request.headers['cookie']
  let sessionId
  try { // 读取 Cookie 中的 id 值
   sessionId = cookie.split(';').filter(s => s.indexOf('session_id=') >= 0)[0].split('=')[1]
  } catch (error) {}
  if (sessionId && session[sessionId]) {
   // 从 session 中读取对应的值
   const userId = session[sessionId].user_id
   // 读数据库
   let userArray = JSON.parse(fs.readFileSync('./database/users.json'))
   // 找到符合的 user
   let user = userArray.find(user => user.id === userId)
   const homeHtml = fs.readFileSync('./public/home.html').toString()
   let string
   if (user) {
    string = homeHtml.replace('{{loginStatus}}', '已登录').replace('{{user.name}}', user.name)
    response.write(string)
   }
  } else {
   // 读取源文件内容
   const homeHtml = fs.readFileSync('./public/home.html').toString()
   // 替换文字
   const string = homeHtml.replace('{{loginStatus}}', '未登录').replace('{{user.name}}', '')
   response.write(string)
  }
  response.end()
 } else if (path === '/register' && method === 'POST') {
  response.setHeader('Content-Type', 'text/html; charset=UTF-8')
  // read database
  let userArray = JSON.parse(fs.readFileSync('./database/users.json')) // read database
  const array = []
  request.on('data', (chunk) => {
   array.push(chunk)
  })
  request.on('end', () => {
   // convert string
   const string = Buffer.concat(array).toString()
   // convert obj
   const obj = JSON.parse(string)
   // last user id
   const lastUser = userArray[userArray.length - 1]
   // new user
   const newUser = {
    id: lastUser ? lastUser.id + 1 : 1,
    name: obj.name,
    password: obj.password
   }
   userArray.push(newUser)
   // write data
   fs.writeFileSync('./database/users.json', JSON.stringify(userArray))
  })
  response.end()
 } else {
  response.statusCode = 200
  let content
  // setting index
  const filePath = path === '/' ? '/index.html' : path
  // judge type
  const index = filePath.lastIndexOf('.')
  const suffix = filePath.substring(index)
  const fileType = {
   '.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()
 }

 /******** main end ************/
})

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搭建动态服务器内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
学习jquery之一
Apr 27 Javascript
CLASS_CONFUSION JS混淆 全源码
Dec 12 Javascript
使用javascript获取页面名称
Dec 23 Javascript
jQuery中triggerHandler()方法用法实例
Jan 19 Javascript
使用jquery实现仿百度自动补全特效
Jul 23 Javascript
jQuery实现页面顶部显示的进度条效果完整实例
Dec 09 Javascript
jQuery使用cookie与json简单实现购物车功能
Apr 15 Javascript
jQuery实现点击按钮文字变成input框点击保存变成文字
May 09 Javascript
react实现pure render时bind(this)隐患需注意!
Mar 09 Javascript
微信小程序 标签传入数据
May 08 Javascript
js获取form表单中name属性的值
Feb 27 Javascript
layui table 多行删除(id获取)的方法
Sep 12 Javascript
js+css实现全屏侧边栏
Jun 16 #Javascript
JavaScript装箱及拆箱boxing及unBoxing用法解析
Jun 15 #Javascript
通过实例解析JavaScript for in及for of区别
Jun 15 #Javascript
vue proxy 的优势与使用场景实现
Jun 15 #Javascript
原生JS利用transform实现banner的无限滚动示例代码
Jun 15 #Javascript
koa中间件核心(koa-compose)源码解读分析
Jun 15 #Javascript
为react组件库添加typescript类型提示的方法
Jun 15 #Javascript
You might like
解析Linux下Varnish缓存的配置优化
2013/06/20 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
laradock环境docker-compose操作详解
2019/07/29 PHP
两种常用的javascript数组去重方法思路及代码
2013/03/26 Javascript
jQuery动画animate方法使用介绍
2013/05/06 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
2013/08/19 Javascript
JavaScript改变HTML元素的样式改变CSS及元素属性
2013/11/12 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
jQuery简单实现仿京东商城的左侧菜单效果代码
2015/09/09 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
javascript中json基础知识详解
2017/01/19 Javascript
JS验证字符串功能
2017/02/22 Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
2017/03/30 jQuery
Vue.js的动态组件模板的实现
2018/11/26 Javascript
vue 项目build错误异常的解决方法
2019/04/22 Javascript
Vue 实现分页与输入框关键字筛选功能
2020/01/02 Javascript
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
python高阶爬虫实战分析
2018/07/29 Python
python3实现zabbix告警推送钉钉的示例
2019/02/20 Python
python之PyQt按钮右键菜单功能的实现代码
2019/08/17 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
2019/09/26 Python
浅谈pycharm导入pandas包遇到的问题及解决
2020/06/01 Python
总结Pyinstaller的坑及终极解决方法(小结)
2020/09/21 Python
HTML5 Canvas概述
2009/08/26 HTML / CSS
国旗下演讲稿
2014/05/08 职场文书
竞聘上岗演讲
2014/05/19 职场文书
司机岗位职责说明书
2014/07/29 职场文书
初中生散播谣言检讨书
2014/11/17 职场文书
财务出纳岗位职责
2015/03/31 职场文书
交通处罚决定书
2015/06/24 职场文书
决心书格式范文
2015/09/23 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
SpringMVC 整合SSM框架详解
2021/08/30 Java/Android
mysql的Buffer Pool存储及原理
2022/04/02 MySQL