node—express

单于奕
2023-12-01

express

  • 安装
  • 配置
  • 接收请求
  • 响应

简单的服务器 08express1/server.js

const express = require('express');

    var server = express();//创建服务
    //请求根目录执行

    server.use('/a.html',function(req,res){
        res.send('aaa');
        res.end();
    });
    server.use('/b.html',function(req,res){
        res.send('bbb');
        res.end();
    });

    server.listen(8080);//监听

req res 原来的方法还有。只是新增了一些东西,比如write,end

//send可以直接返回 json
    server.use('/a.html',function(req,res){
        res.send({a:1,b:2});
        res.end();
    });

小结

  • 创建服务 var server = express();
  • 处理请求 server.use(地址,function(req,res){})
  • 监听 server.listen(8080);

3种接收用户请求的方法 08express1/server1.js

职匹配一个

  • get请求: get('/',function(req,res){})
  • post请求: post('/',function(req,res){})
  • request: use('/',function(req,res){})

响应文件 08express1/server2.js

  • express-static:

    npm install express-static
  • 08express1/server2.js

    const express = require('express');
    const expressStatic = require('express-static');
    var server = express();
    
    server.listen(8080);
    
    //指定去哪儿读 静态文件
    server.use(expressStatic('./www'));
    
    // localhost:8080/a.html

接口 08express1/server3.js

  • /login?username=yuonly&pwd=123
  • 返回: {"ok":true,"msg":"成功"}

  • 获取参数 req.query

    var users ={
                'yuonly':'123123',
                'zhangsan':'666',
                'lisi':'999'
            }
            server.get('/login',function(req,res){
                //直接获取get参数的对象
                var username = req.query['username'];
                var pwd = req.query['pwd'];
                if(users[username]==null){
                    res.send({ok:false,msg:'用户不存在'});
                }else{
                    if(users[username]!=pwd){
                        res.send({ok:false,msg:'用户名密码错误'});
                    }else{
                        res.send({ok:true,msg:'登录成功'});
                    }
                }
            })
    
            // http://localhost:8080/login?username=lisi&pwd=123

数据处理 09express2/server.js 09express2/form.html

1 get: req.query

2 post: req.body

安装 bodyparser
    npm install body-parser

    引入模块
    const bodyParser = require('body-parser');
    定义urlencoded中间件
    server.use(bodyParser.urlencoded({}));
    server.post('/',function(req,res){
        从req.body中读取post数据
        console.log(req.body);
    })

小结

  • get: 无需中间件 req.query
  • post: 需要 body-parser中间件

    server.use(bodyParser.urlencoded({
            extended:true,//启用扩展模式,意义不大
            limit:2*1024//限制 默认100k
        }));
    
        req.body

中间件:使用、写、链式操作

链式操作 09express2/server1.js

server.use('/',function(req,res,next){
        console.log('aaa');
        next();
    })

    server.use('/',function(req,res,next){
        console.log('bbb');
    })

自己定义一个body-parser中间件的功能 09express2/server2.js

server.use(function(req,res,next){
            var str = '';
            req.on('data',function(data){
                str += data;
            })
            req.on('end',function(){
                //解析过后的数据,绑定到req.body身上
                req.body = querystring.parse(str);
                //next后,在下面匹配的中间件仍然可以接收到 req.body的数据
                next();
            })
        })

        server.use('/',function(req,res){
            console.log(req.body);
        })

封装自己的body-parser

1 09express2/lib/my-body-parser.js
const querystring = require('querystring');

        module.exports = function(req,res,next){
            var str = '';
            req.on('data',function(data){
                str += data;
            })
            req.on('end',function(){
                req.body = querystring.parse(str);
                next();
            })
        }
2 在 09express2/server3.js 中使用
const express = require('express');
        const bodyParser2 = require('./libs/my-body-parser.js');
        var server = express();
        server.listen(8080);
        server.use(bodyParser2);
        server.use('/',function(req,res){
            console.log(req.body);
        })
3 使用 09express2/form.html 测试

session、cookie

  • cookie: 在浏览器保存一些数据,每次向服务器发起请求都会带过来

    不安全、存储空间小(4K)

  • session: 保存在服务端,但session依赖cookie

    更安全

    cookie中会有一个sessionid的ID,服务器根据cookie带过来的sessionid找到服务器端与之对应的文件,进行读取或写入

cookie 10cookie-session/server.js

cnpm install express express-static cookie-parser cookie-session
  • 读取-cookie-parser
  • 发送 res.cookie('user','yuonly',{path:'/aaa',maxAge:30*24*3600*1000});
  • 加密 10cookie-session/server2.js

    req.secret = 'yuonly123123123';
        res.cookie('user','yuonly',{signed:true});

读取及发送小例子 10cookie-session/server2.js

const express = require('express');
        var server = express();
        //cookie
        const cookieparser = require('cookie-parser');
        server.use(cookieparser());

        server.use('/aaa/a.html',function(req,res){
            //读取cookie 装完cookie-parser后有这个属性
            console.log(req.cookies,'read');
            //发送cookie
            res.cookie('user','yuonly',{path:'/aaa',maxAge:30*24*3600*1000});
            res.send('ok');
        })

        // http://localhost:8080/aaa/a.html

        server.listen(8080);

小结

  • 发送

    res.sercet = 'sjksdjfkl123';
    res.cookie(名字,值,{path:生效路径,maxAge:有效期,signed:是否需要签名})
  • 读取cookie

    cookie-parser
    service.use(cookieParser(签名))
    service.use(function(req,res){
    
        req.cookies;
        req.signedCookies;
    })
  • 删除

    res.clearCookie(key)
  • 扩展--加密 cookie-encrypter

session 10cookie-session/server3.js

  • cookie-session
1 读取
server.use(cookiesession({
            //session要有效,必须设置keys。
            keys:['111','2222','3333','4444','555']
        }));

        if(req.session['count']==null){
            req.session['count'] = 1;
        }else{
            req.session['count']++;
        }
        console.log(req.session['count']);
        res.send('ok');

        res.end();
2 写入
req.session['count'] = 1;

模板引擎

  • jade-破坏式、侵入式、强依赖
  • ejs-非侵入式的,不破坏原有的html、css

ejs

  • 安装

    cnpm install ejs

1 11ejs/1.js

const ejs = require('ejs');
    //              模板            数据             
    ejs.renderFile('./view/1.ejs',{name:'yuonly'},function(err,data){
        console.log(data);
    });

2 11ejs/view/1.ejs

<div>
      <%= name %>
    </div>

ejs 循环数据

1 11ejs/2.js

const ejs = require('ejs');

    ejs.renderFile('./view/2.ejs',{json:{arr:[{username:'yuonly'},{username:'xiaowang'}]}},function(err,data){
        console.log(data);
    });

2 11ejs/view/2.ejs

<% for(var i=0;i<json.arr.length;i++){ %>
      <div>
        <%= json.arr[i].username %>
      </div>
      <% } %>

ejs中非转义输出 <%- %>

1 11ejs/view/3.ejs

<% var str = '<div></div>'; %>
    // html实体
      <%= str %>
      // html标签本身
        <%- str %>

express整合到一起 012expressall

  • 主体
  • cookie、session
  • 数据
  • 模板引擎

1 安装相关包

cnpm install express express-static cookie-parser cookie-session body-parser ejs --save

2 目录说明

  • libs:第三方模块
  • views:模板
  • www:网站根目录
  • server.js: express服务器

bodyparser弊端,只能解析post数据,不能处理post上来的文件

文件上传测试 12expressall/server_file.js post.html

1 body-parser

只能获取上传文件的文件名.form表单 加上 enctype之后,干脆没东西了。

server_file.js
const express = require('express');
        const bodyParser = require('body-parser');
        var server = express();
        server.use(bodyParser.urlencoded({extended:false}));
        server.post('/',function(req,res){
            console.log(req.body);
        })
        server.listen(8080);
post.html
<form action="http://localhost:8080" method="post" enctype="multipart/form-data">
          文件: <input type="file" name="username" id=""> <br>
          <input type="submit" value="上传">
        </form>

2 multer 用来处理文件上传 12expressall/server_multer.js

//1 安装
        cnpm install multer --save
        //2 导入
        var multer = require('multer');
        //3 创建multer对象
        var objMulter = multer({dest:'./www/upload/'});
        //4 使用对应方法,any 上传多文件
        server.use(objMulter.single('f1'));

        server.post('/',function(req,res){
            //5 获取上传文件
            console.log(req.files);
            // [ { fieldname: 'username',
            // originalname: '屏幕快照 2017-05-30 上午8.12.11.png',
            // encoding: '7bit',
            // mimetype: 'image/png',
            // buffer: <Buffer 89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52 00 00 01 10 00 00 01 94 08 06 00 00 00 fd 2b 7d db 00 00 01 5e 69 43 43 50 49 43 43 20 50 72 6f 66 69 ... >,
            // size: 160018 } ]
        })

3 发现上传后的文件没有扩展名,所以需要用fs模块对该文件进行重命名 12expressall/rename.js a.txt

4 如果要对上传文件重命名,还需要知道原来文件的路径等信息,使用path。12expresssall/path.js


文件上传小结

  • body-parser :用来解析post数据
  • multer:用来解析文件的数据 enctype="multipart/form-data"

    //1 multerObj
        var obj = multer({dest:'upload'});
        //2 设定上传方法
        server.use(obj.any());
        //3 使用
        server.use('/',function(req,res,next){
            <!-- req.files -->
            //4.新的文件名
            var pathObj = pathLib.parse(req.files[0].originalname);
            var newName = req.files[0].path + pathObj.ext;
            //5.重命名 req.files[0].path
            fs.rename(req.files[0].path,newName,function(err){
                if(err){
                    res.send('上传失败');
                }else{
                    res.send('成功');
                }
            })
        })

consolidate-适配各种模板引擎

cnpm install consolidate --save

配置模板引擎

  • 输出什么东西

    server.set('view engine','html');
  • 模板文件放在哪儿了

    server.set('views','./views');
  • 我要用哪种模板引擎

    server.engine('html',consolidate.ejs);

路由 13express_consolidate/server_route.js

相当于子服务器 server

//1.创建router
    var routeUser = express.Router();
    //2.把router添加到server
    server.use('/user',routeUser);
    //3.router内部的路由的定义
    routeUser.get('/1.html',function(req,res){
        res.send('user1');
    })
    routeUser.get('/2.html',function(req,res){
        res.send('user222');
    })



    //localhost:8080/user/1.html
    //localhost:8080/user/2.html

mysql 14mysql

  • 关系型: mysql、oracle
  • 非关系型-文件型: mongo

Server端:存数据 Client端:管理工具、Node


Server安装 官网下载安装

基本概念

1 库:文件夹
2 表:excel文件
行: 一条数据
列:(字段、域) 一个数据项

客户端安装

cnpm i mysql --save

使用nodejs 链接mysql

const mysql = require('mysql');
        //1.链接数据库
        // mysql.createConnection(哪台服务器,用户名,密码,库名);
        var db = mysql.createConnection({
            host:'localhost',
            user:'root',
            password:'root',
            database:'jy1608_blog',
            port:8889
        });
        //2.查询
        db.query("SELECT * FROM `user`;",function(err,data){
            if(err){
                console.log(err);
            }else{
                console.log(data,'data');
            }
        })

转载于:https://www.cnblogs.com/MrsQiu/p/7083467.html

 类似资料: