Node之存储

来源:互联网 发布:js 上传图片控件 编辑:程序博客网 时间:2024/06/06 02:47

localStorage(本地存储)

  • 特点
    • 1.是H5提供的不兼容低版本浏览器
    • 2.存储内容大小为5MB
    • 3.不受安全卫士,浏览器等清除的影响
    • 4.永久存储到本地,不手动删除会一直存在,关掉浏览器也会存在
    • 5.严格的本地存储,与服务器无关
    • 6.存储获取的结果是字符串
  • localStorage的使用

    • 设置

        localStorage.setItem([key],[value])
    • 获取

        localStorage.getItem([key])
    • 移除

        localStorage.removeItem([key])
    • 通过索引获取指定位置存储信息对应的key

        localStorage.key([key])
    • 清空本源下的所有存储信息

        localStorage.clear()

sessionStorage(临时存储)

  • 与localStorage用法一致的会话存储,页面刷新会话还可以保存,一旦页面关闭,信息就清空了

cookie(本地存储)

  • 特点
    • 1.兼容所有浏览器
    • 2.存放的内容少,4kb,浏览器会限制一个站点最多可以存放20个cookie
    • 3.不安全,重要信息最好不要存放在cookie上(md5加密)
    • 4.cookie容易被安全卫士等软件清除
    • 5.有过期时间
    • 6.不是严格的本地存储,获取cookie时,保证服务器和客户端保持连接,读取cookie也要经过HTTP处理
  • cookie的应用
   let http=require('http');   let url=require('url');   let querystring=require('querystring')   http.createServer(function(req,res){       let {pathname}=url.parse(req.url,true);       res.setHeader('Content-type','text/html;charset=utf-8')       //当客户端访问的路径是/write的话就表示写cookie      if (pathname=='/visit'){            let cookie=req.headers.cookie;            let visit=1;            if (cookie){                 //cookie并不是真正的查询字符串,所以不同字段的风格符是; ,而不是&,所以在解析的时候要注意传入字段分隔符                 let cookieObj=querystring.parse(cookie,'; ')                if(cookieObj.visit){                     // + 字符串转数字的意思                     visit=(isNaN(+cookieObj.visit)?0:parseInt(+cookieObj.visit))+1                 }              }             res.setHeader('Set-Cookie',`visit=${visit}`)             res.end(`顾客欢迎你第${visit}次来`)    }else{             res.end('404')    }}).listen(8081);


  • queryString扩展

原理:利用&把字段分开,再用等号把键和值分开
参数:参数1-》要分隔的内容 参数2:以什么进行分割
有两个方法:querystring.parse() querysting.stringfy()

 let str='id=1&age=3'; let querystring=require('querystring') let obj=querystring.parse(str,'&’)//&是默认的分隔符
  • md5加密

    • 特点
      • (1)任意长度的输入,会产生出相同长度的输出
      • (2)不同的输入一定要输出不同的输出
      • (3)不能从输出内容反推输入的值
    • 加密方式
      • 依赖于内置模块 crypto
      createHash 指定算法 update要加密的字符串  digest以16进制的格式输出摘要的结果    let crypto=require('crypto')    let str='hello'    let res=crypto.createHash('md5').update(str).digest('hex')    //每次加密之后更新的值都不一样,因此在使用过程中,要每次都获取新的值

session(服务器存储)

  • 存放在服务器上
  • session的操作
    • 写 req.session.username=’wang’
    • 读 req.session.error
    • 删除 delete req.session error
  • 使用session的参数

        app.use(session({        resave:true,//每次客户端来请求的时候,都要重新保存筛选         saveUninitialized:true,//保存未使用过的session         secret:'wang' //密匙,用来加密session    }))
  • 完整demo

    权限管理系统 注册get/post,登录get/post,欢迎页面get /reg
    1.先通过get访问注册页面,返回空白的注册表单 /user
    2.填写此注册表单,如果注册成功跳到登录页,如果注册失败返回注册表单 /login
    3.填写登录表单,发送post登录请求,如果登录成功,跳到用户主页,如果登录失败,调回录页

        let express = require('express');    let path = require('path');    let bodyParser = require('body-parser');    let session = require('express-session');    let crypto = require('crypto');    let app = express();    app.use(session({      resave:true,      saveUninitialized:true,      secret:'zfpx'    }));    //此中间件是专门用来处理请求体的,会把查询字符串格式的请求体转成一个对象并赋给req.body    //把查询字符串变成对象 querystring.parse() qs.parse();    app.use(bodyParser.urlencoded({extended:false}));    //设置模板引擎    app.set('view engine','html');    //设置模板存放的根目录    app.set('views',path.resolve('views'));    //如果模板是html的话,用ejs来进行渲染    app.engine('html',require('ejs').__express);    let users = [];    app.listen(8080);    //当客户端通过GET方式访问/reg的时候,服务器返回一个空白的注册表单    app.get('/reg',function(req,res){      //把cookie中的error属性取出      let error = req.session.error||'';      //清除cookie中的error      //res.clearCookie('error');      delete req.session.error;      res.render('reg',{title:'用户注册',error});    });    app.post('/reg',function(req,res){       let user = req.body;       //找一下用户数组中有没有跟当前传过来的用户用户名相同的用户       let oldUser = users.find(item=>item.username == user.username);       if(oldUser){//如果找到了同名用户,则重定向到注册页         //back是一个关键字,表示上一个页面,从哪来回滚哪里去         //向客户端写入cookie         //res.cookie('error','此用户名已经被占用,请换一个试试');         req.session.error = '此用户名已经被占用,请换一个试试';         res.redirect('back');//让客户端重新向另外一个路径发起请求       }else{//如果没有找到同名的用户,则重定向到登录页         //先对密码进行md5加密后才保存         user.password = crypto.createHash('md5').update(user.password).digest('hex');         users.push(user);         res.redirect('/login');       }    });    //当客户端通过GET方式访问/login的时候,返回登录表单    app.get('/login',function(req,res){      let error = req.session.error||'';      delete req.session.error;      res.render('login',{title:'用户登录',error});    });    //当客户端提交登录表单之后    app.post('/login',function(req,res){     let user = req.body;//{username,password}      //查找一下看看用户数组中有没有符合条件的用户     let oldUser = users.find(item=>item.username==user.username && item.password == crypto.createHash('md5').update(user.password).digest('hex'));     if(oldUser){//如果找到了说了登录是成功的       req.session.success = '登录成功';       req.session.username = oldUser.username;       res.redirect('/user');     }else{//如果没有找到,说明登录是失败的       req.session.error = '用户名或密码输入错误';       res.redirect('back');     }    });    //用户主页    app.get('/user',function(req,res){     let success = req.session.success||'';     let error = req.session.error||'';     let username = req.session.username||'';     delete req.session.success;     delete req.session.error;     res.render('user',{title:'用户主页',success,error,username});    });    建一个views文件夹,里边有login.html,reg.html,user.html文件,文件中要设置<title><%=title%></title> <p style="color:red"><%=error%></p>等,凡是通过此js文件展示在对应html页面的内容,都应该在html中加入模板
  • 服务器存储的技术方案
    • 1.session
    • 2.文件存储
    • 3.数据库存储
      • mongodb(NODE) 轻量级
      • Access微软办公自带
      • My SQL更轻量级
      • SQL SERVER 容量较大的存储
      • ORACLE 容量更大的存储
原创粉丝点击