• node系列--【express生成器安装及第三方中间件安装】


    一、express生成器安装

    第一次使用需要全局安装:

    安装: npm i express-generator -g

    安装完成后 : express -h 查看常用命令

    创建步骤:

    1)express --view=ejs sa02

    ​ --view=ejs 将ejs指定为默认的模板引擎

    ​ sa02 指新创建的项目文件夹,不能是中文或关键词

    2)cd sa02 进入当前项目

    3) npm i 安装package.json配置中的依赖,全部安装所有包

    4) 拷贝nodemon.json 到当前的项目下面

    5) 修改 package.json, 添加一行代码:

      "scripts": {
        "start": "node ./bin/www",
        "dev":"nodemon ./bin/www"
      },
    

    ​ 以后启动项目,执行 npm run dev 即可

    6) 找到 ./bin/www 文件 ,28行添加回调函数:

    server.listen(port,()=>{
    
     console.log("http://127.0.0.1:3000");
    
    });
    

    二、 第三方中间件

    2.1 热更新 nodemon

    ​ 作用,监听代码的改动,当代码改变之后,自动重启(自动重新执行程序)

    ​ 1) npm init -y

    ​ 2) npm i express

    ​ 3) npm i nodemon -g (全局安装,只需要安装一次,可以在任何项目中调用)

    ​ 4)创建一个nodemon.json 的配置文件,内容:

    {
      "restartable": "rs",
      "ignore": [".git", ".svn", "node_modules /**/ node_modules"],
      "verbose": true,
      "execMap": {"js": "node --harmony"},
      "watch": [],
      "env": {"NODE_ENV": "development"
      },
      "ext": "js json"
    }
    

    ​ 将 nodemon.json 拷贝到项目的根目录下

    ​ 最后,启动项目 nodemon index.js

    注意,如果出现报错,可按照以下方法处理:

    https://blog.csdn.net/larpland/article/details/101349586

    2.2 表单数据解析 formidable

    ​ 作用:可以将用户的表单数据处理为对象,特别是有上传控件时,方便开发者调用。

    ​ 安装: npm i formidable

    ​ 配置使用:

    ​ 首先引入该模块

    let formidable = require("formidable");
    

    ​ 然后在路由的处理函数中使用:

    app.post("/baoming",(request,response)=>{
      // 配置
      const form = formidable({ multiples: true });
      // 设置上传文件的存放目录
      form.uploadDir = "./upload";
      // 解析表单中的数据
      form.parse(request,(err,fields,files)=>{
        // fields 是普通的表单控件的name和value组成键值对的对象
        let {username,userage} = fields;
        // files 是上传控件的name和上传文件信息组成的对象
        let photoPath = files.photo.path;
        
        response.writeHead(200, { 'content-type': 'application/json' });
        response.end(JSON.stringify({ fields, files }, null, 2));
      })
    

    ​ fields 和 files 内容如下:

      "fields": {
        "username": "李四",
        "userage": "19"
      },
      "files": {
        "photo": {
          "size": 25046,
          "path": "upload\upload_3d005dab15156ca61b66be947a366720",
          "name": "3016253704_23.jpg",
          "type": "image/jpeg",
          "mtime": "2021-04-20T07:06:56.940Z"
        }
      }
    

    更名操作,将上传的文件加上后缀名。更名完成后,将用户的数据拼为josn,写入到文件中。

        // 更名
        let oldPath = files.photo.path;
        let orgiName = files.photo.name; //原始文件名
        let extName = path.extname(orgiName); //获取扩展名 .jpg
        let newPath = oldPath + extName;
        // 更名函数,参数1是要更名的文件路径。参数2是更名后的文件路径
        fs.rename(oldPath,newPath,(err)=>{
          if(!err){
            let obj = {username,userage,userphoto:newPath};
            fs.writeFile("./data/"+username+".txt", JSON.stringify(obj), (err)=>{
              response.send("报名成功");
            })
          }
        })
    

    查看报名列表 /list

    app.get("/list",(request,response)=>{
      let files = fs.readdirSync("./data");
      let str = "<style>table,th,td{border:1px solid #000;}</style><table><tr><th>姓名</th><th>性别</th><th>照片</th></tr>"
      for( let item of files){
        let data = fs.readFileSync("./data/"+item);
        let obj = JSON.parse(data.toString()) 
        str += `<tr><td>${obj.username}</td><td>${obj.userage}</td><td><img src="${obj.userphoto}" width=100 height=60></td></tr>`;
      }
      str += "</table>";
      response.send( str )
    })
    

    响应图片请求,显示图片

    app.get("/upload/:imgURL",(request,response)=>{
      let imgURL = request.params.imgURL;
      fs.readFile("./upload/"+imgURL, (err,data)=>{
        response.send( data )
      })
    })
    

    ​ 负责设置客户端的cookie,获取浏览器端的cookie。cookie作用:客户端存储技术,用于存储用户的登录状态、用户的账号、头像、兴趣爱好、交易记录。

    1. npm init -y

    2. npm i express

    3. 拷贝一个nodemon.json

    4. npm i cookie-parser

    5. 创建一个入口文件 index.js

    2.3.1 普通cookie

    配置cookie-parser中间件:

    let cookieParser = require("cookie-parser");
    // 配置cookie-parser中间件,必须要放在路由代码之前
    app.use( cookieParser() )
    

    cookie添加:

    // 语法: response.cookie("名称","值")
    response.cookie("username","jack"); //添加一个cookie作为登录凭证
    

    cookie读取:

    // 用户每次发送请求,浏览器就自动会将cookie 附加在请求对象上
    // 读取cookie: request.cookies.名称 或  request.cookies[名称]
      if( !request.cookies["username"] ){
        // 没有cookie,提示去登录
        response.send("请登录后访问,<a href='/login'>登录</a>")
      }else{
        response.send("欢迎"+ request.cookies["username"] +"访问首页")
      }
    

    2.3.2 加密cookie (签名cookie)

    添加cookie时的选项:

    domain:cookie在什么域名下有效,类型为String,。默认为网站域名

    expires: cookie过期时间,类型为Date。如果没有设置或者设置为0,那么该cookie只在这个这个session(会话)有效,即关闭浏览器后,这个cookie会被浏览器删除。

    maxAge: 实现expires的功能,设置cookie过期的时间,类型为String,指明从现在开始,多少毫秒以后,cookie到期。

    path: cookie在什么路径下有效,默认为'/'表示整个网站目录下有效,类型为String

    secure:只能被HTTPS使用,类型Boolean,默认为false

    httpOnly: 只能被web服务器访问,类型Boolean。即浏览器端不能访问使用cookie,可以防止XSS(跨站脚本攻击)攻击。

    signed:使用签名,类型Boolean,默认为false。express会使用req.secret来完成签名

    使用签名cookie步骤:

    1) 添加cookie时,增加 {signed:true}

    response.cookie("username","jack",{maxage:1000*60*60*24,signed:true});
    

    2)配置cookie中间件时,添加一个签名字符串。

    // 配置cookie-parser中间件;如果要使用签名cookie,则添加一个签名字符串
    app.use( cookieParser("offnc.com") )
    

    3) 读取cookie时,使用 request.signedCookies.名称 或者 request.signedCookies["名称"]

    request.signedCookies["username"]
    

    3.4 session 管理

    安装: npm i express-session

    作用:一种基于后端的临时存储数据的技术。存储在服务器上缓存中。

    配置文件说明:

    secret 一个 String 类型的字符串,作为服务器端生成 session 的签名

    name 返回客户端的 key 的名称,默认为 connect.sid,也可以自己设置

    resave 强制保存 session 即使它并没有变化,。默认为 true。建议设置成 false。

    saveUninitialized 强制将未初始化的 session 存储。当新建了一个 session 且未设定属性或值时,它就处于未初始化状态。在设定一个 cookie 前,这对于登陆验证,减轻服务端存储压力,权限控制是有帮助的。(默 认:true)。建议手动添加

    cookie 设置返回到前端 key 的属性,默认值为{ path: ‘/’, httpOnly: true, secure: false, maxAge: null }

    rolling 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)

    配置项:

    // 配置session
    let options = {
      secret:"offcn.com",
      resave:false,
      saveUninitialized:true,
      cookie:{ httpOnly: true, secure: false, maxAge: null }
    }
    app.use( session(options) );
    

    添加:request.session.username = "jack" 或 request.session["username"] = "jack"

      request.session.sex = "男";
      request.session.age = 20;
    

    读取: request.session.username 或 request.session["username"]

        if( request.session.sex == "男" ){
          response.send("欢迎"+ request.signedCookies["username"] +"先生访问首页")
        }else{
          response.send("欢迎"+ request.signedCookies["username"] +"女士访问首页")
        }
    

    ​ 总结:

    ​ session、cookie 都可以在页面之间共享信息,形式上都是键值对(key-value),只能保存字符串类型(json可以字符串化)。

    ​ 不同之处:cookie 存在客户端(浏览器的临时文件夹中)。session存在服务端的缓存中。

    3.5 svg-captcha 图形码验证

    ​ 作用:随机生成字符串,然后将字符串转为svg格式的图像,添加一些干扰线条。将图像发送给客户端

    安装: npm i svg-captcha

    ​ 配置:

    let captcha = require("svg-captcha");
    

    ​ 然后在路由的处理函数中的代码:

    router.get("/yzm",(request,response)=>{
      // svg-captcha的配置项:
      let option = {         
        size: 4,  //验证码长度
         100,
        height: 60,
        background: "#f4f3f2",
        noise: 4,//干扰线条数
        fontSize: 42,
        ignoreChars: '0o1i',   //验证码字符中排除'0o1i'
        color: true // 验证码的字符是否有颜色,默认没有,如果设定了背景,则默认有           
      }
      let svg = captcha.create(option);
      console.log( svg);
      response.type("svg");
      request.session.yzm = svg.text;
      // 将svg对象中的text属性保存为一个session,将对象的data部分发送到浏览器,让用户填写验证码。当表单提交后,获取用户填写的验证码和session中的字符串进行对比。如果不一致就提示用户验证码错误。
      response.send( svg.data )
    })
    

    前端页面添加标签

    <img src="/yzm" alt=""><br/>
    
  • 相关阅读:
    ES6新语法之---块作用域let/const(2)
    sass变量
    Ruby(或cmd中)输入命令行编译sass
    sass的安装
    鼠标滚动兼容
    HTML5新标签兼容——> <!--<if lt IE 9><!endif-->
    #include stdio.h(7)
    #include stdio.h(6)
    #include stdio.h(5)
    #include stdio.h(3)
  • 原文地址:https://www.cnblogs.com/chenhaiyun/p/14706283.html
Copyright © 2020-2023  润新知