Node基础

233 阅读19分钟

一、Node基础

  • 1.Node.js采用V8引擎,使用事件驱动,非阻塞和异步I/O模式

  • 2.Node.js 都是异步操作,所有的API都有回调函数

  • 3.采用事件轮询机制

二、模块分类 (一个js 文件就是一个模块)

  • 1.内置模块(系统模块) http、 fs、 url...

  • 2.自定义模块, module.exports导出

  • 3.第三方模块

三、require导入模块的使用(ES6 import导入模块) [Common.js规范]

  • const http = require('http'); 导入内置模块,赋值给一个变量使用
  • const http = require('./tool.js') 导入自己定义的模块, 绝对路径, .js可与不写,Node默认为.js文件
模块的导出
 1.Common.js规范
                导入: require('http') 、require('./tool')
                导出: exports 、 modules.export
                exports和modules.export的区别?  => https://cnodejs.org/topic/52308842101e574521c16e06
    
 2.ES6规范
            
                导入: import预解释就完成了、    import()方法导入模块,按需加载
                导出: export (export default)
                
                
                

四、常用内置模块

1.http模块 (=>www.jianshu.com/p/ab2741f78…)

 const http = require('http'); //=> require('http.js')
 => createServer创建服务器,并返回一个实例,里面有个listen监听端口号
 http.createServer()
 
      ===> eg:
      cosnt http = require('http');
      http.createSrever((request, response) => {
          res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'}); // 设置响应头部信息及编码
          response.write('hello world Node.js');
          response.end(); //==> 结束请求
      }).listen(8080); 
      
      
      

const http = require('http'); // ==>> 内置模块 -- node_modules文件夹里面的模块 const fs = require('fs'); const url = require('url'); const a = require('./tools'); // ==> module.exports exports console.log(a); console.log(a.getX());

let x = 1; //==>模块里面的变量,不是全局变量,不能挂在全局对象上 global.x = 'goloba'; // ==> 定义全剧变量 console.log(global.x);

http.createServer((req, res) => { console.log(url.parse(req.url, true)); path fs.readFile('./a.txt', (err, data) => { if (err) {

    }

    fs.writeFile('./b.txt', 'bbbb', (err) => {
        if (err) {
            console.log(err);
        }

        console.log('ok');
    });

    res.end(data.toString());
});
 // res.end('okkkk');

}).listen(8888);

//==> 传入匿名函数传值
function fn(callback) {
    let val = 1;
    setTimeout(() => {
        callback && callback(val);
    }, 1000);
}

fn((val)=>{
    console.log(val);
});



//==> 传入匿名回调函数,进行回调  <callback>
http.createServer((req, res) =>{

});

Node内置的模块:
    http
    url
    fs
    querystring


NodeJS里面的全局变量,必须挂到Golobal对象上,因为每个js都是一二模块,模块和模块之前是相互独立的,
 => 模块里面的变量不是全局变量的原理是: JS是函数式编程,利用闭包原理进行包裹了一层,成了私有作用域
 => 常用module.exports导出全部, Common.js规范
  ;((require, exports, module) =>{
        exports.a = 1;
        exports.b =2;
        module.exports = {
            a: 1,
            b: 2
        }

       Global.setA = function() {

       };

      Global.getA = function() {

      };
  })();

内置模块: => http模块

1.创建服务

  1. 引入http模块 const http = rquire('http');

  2. 创建服务 http.createServer() Request: 请求 输入-请求的信息, 请求的字段 - request.url 得到请求的路径 http://localhost:8080/home.index =>/home.html

    Response: 响应 输出-输出的东西 - response.write(); 返回东西给前端 - response.end(); 结束请求

    http: 协议

    eg:

    const http = require('http'); http.createServer((req, res) =>{ var url = req.url; if (url ==='/index.html') { res.write('index page'); } else if(url ==='/list.html') { res.write('list page') } res.end(); }).listen(8080);

参数: 1. url.parse(req.url, true).query 2. queryString.parse(url) 3. express.js req.query

2.文件处理 fs模块 file sysment 文件系统

都是异步的:

读文件 => fs.readFile(文件名路径, (err, data) => {}); Buffer二进制流,toString()转为 写文件 => fs.writeFile(文件名路径, 内容, err => {console.log(err)});

同步: 多个操作可以同时进行,前一次的操作没有完事,后一次也能开始 异步: 一次一个执行

3.数据请求 前后台交互 http协议: 前台: form、 ajax、 jsonp 后台: 一样 请求方式:
Get 参数在url上面 Post 参数在请求体里面 Put Delete Update url模块 ==> 模块 const urlLib = rquire('url'); 格式化URL参数: url.parse(str[, true]); 默认不解析query, true自动解析query为对象

let str = 'http://baidu.com:8080/home.html?name=clh&age=26'
获取URL信息 const urlLib = url(request.url(), true);
console.log(urlLib.parse());
protocol: 'http:',
slashes: true,
auth: null,
host: 'baidu.com:8080',
port: '8080',
hostname: 'baidu.com',
hash: null,
search: '?name=clh&age=26',
***query: 'name=clh&age=26',
***pathname: '/home.html',
path: '/?name=clh&age=26',
href: 'http://baidu.com:8080/?name=clh&age=26'

eg: const http = require('http'); const url = require('url'); http.createServer((req, res) => { let urlLib = url.parse(req.url, true); console.log(urlLib); }).listen(8080);

后台接收数据情况: 1. ===================>> Get 方法穿参数, 转对象 数据在请求头里面 url参数 - 自己写方法封装 - querystring模块, 只能解析?后面的东西 xxx=xx&xx=xx queryString; {xxx:xx, xx:xx} - url.parse(urlstr[, true]) 能解析好多 aa=?xx=xx&xx=12 ***query: 'name=clh&age=26', ***pathname: '/',

2. =================>> Post 方法穿参数,    转对象     数据在请求体里面
    Get方式数据: req.url--urlLib.parse(url, true);


    POST数据接收: POST数据比GET大的多

    POST很大 -- 分段接收 

  
    const str = '';
    //==>> 'data'自定义是事件  data是这一次接收的参数
    当有一段数据到达的时候执行
    request.on('data', data => {
        str += data;
    });

    数据全部到达(一次)
    request.on('end', () => {
        console.log(querystring.parse(str)); //输出接收的参数
    });

eg: const http = require('http'); const querystring = require('querystring');

http.createServer((req, res) => {
    let str = '';
    req.on('data', data=>{
        str += data;
    });

    req.on('end', () => {
        let POST = querystring.parse(str);
        console.log(POST);
        res.end();
    });
}).listen(8080);

4.案例 内置模块: http, url, fs, querystring GET,POST数据传送

用户注册、登录

接口: /user?act=reg$user=clh&pass=123456 {"OK", false, "msg":"失败原因"}

/user?act=login$user=clh&pass=123456
{"OK", true, "msg":"失败原因"}

对文件的访问: http://localhost:8080/1.html http://localhost:8080/1.jpg http://localhost:8080/ajax.js

对接口的访问: http://localhost:8080/user?act=reg http://localhost:8080/user?act=login

http知识: segmentfault.com/a/119000000…

====================================== NODE.JS模块化 ============================================

1.系统模块:
-http - url - fs - querystring - Crypto加密 - Events 事件 - Debugger 调试程序 - Net网络操作, 发邮件... - OS操作系统信息 - Path 处理文件路径 - Stream 流操作 - Buffer 二进制流 - Timers 定时器 setTimeout/setInterval - ZLIB 压缩文件, 2.自定义模块: 1). 模块组成 2). npm 3). 发布自己的模块 3.包管理工具: NPM

  1. 统一下载路径
  2. 自动下载依赖
  3. node_modules 下载的模块

npm使用: npm install xxx 安装模块 npm uninstall xxx 卸载模块 npm update xxx 更新模块

NODE里面的模块知识:
    require  引入模块
    - 引入当前自定义模块加入./  let modeule1 = require('./module.js');   
    - 默认导入内置模块, 引入自定义模块加入当前路径 ./
    - .js可以省略,因为NODE.js里面的模块都是js文件

        引入文件有./
            当前目录找

        ***引入文件没有./
            先从系统模块中找, 如果没有在到node_modules文件夹里面找   (系统模块优先))


    module.exports 模块        批量输出    exports.a = 1;   es6 export var a = 1;
    exports 导出模块           一个个输出  module.exports = {}  module.exports = function() {} ... 导出多种类型     module.exports = {} 自己定义的内存地址,将之前的地址覆盖了

    node_modules 模块放这里
  • NODE.js里面没有全局变量,都是模块,全局对象Global,可以给他加一些公用的属性和方法,各个模块可以使用
  • 每个模块都是内置一个闭包,包起来了,所以没有全局变量了, //===>> js没有模块的机制,但是可以通过闭包将全局变量封装起来,成了局部变量 ;((require, exports, module)=>{ let a = 1; let b = 2; expots.a = a ; })();

发布自己的模块: npm login 登录npm网站 npm init 初始化配置文件 (模块说明) npm publish 发布模块 npm unpublish --force 删除摸模块

======================================================================== express.js 框架 ============================================================== express框架:

  1. 依赖中间件
  2. 接收请求
    • get/post/use

    • get('地址', (req, res)=>{}) 3.非破坏式的 req.url , req.body 参数获取 4.static用法 下载 npm install express-static 引入const static = rquire('express-static'); 使用 server.use(static('./www')) express保留了原生的功能,添加了一些方法(send), 增强原有的功能 1.安装 npm install express 2.配置 3.接收请求 4.响应请求

      非侵入式 ,在原生的基础上添加了一些功能 req res

      原生: res.write(); res.end();

      express: res.send(); res.end();

1.创建服务 const express = require('express'); //引入express.js 模块 const server = express();

2.监听端口 server.listen(8080);

3.处理请求 server.use('地址', (req, res) => { let info = req.query() 获取参数 == > req.parse(req.url, true); req.url 得到URL });

三种方法: server.get('地址', (req, res) => {}) get请求 server.post('地址', (req, res) => {}) post请求 server.user('地址', (req, res) =>{}) get/post都可以

express再次学习: 1. 数据 Get, Post req.query 无需中间件 2.中间件:使用,写链式操作 req.body 需要中间件 body-parse const bodyParse = require('body-parser'); 第一步:解析body数据,请求体里面的 => server.use(bodyParse.urlencoded({ extended: true/false, //设置模式 limit: 100K(默认) //限制接收范围多大
})); 第二部: 使用server.use(req => req.body)

express.js
express-static
中间件: body-parser  处理POST的  中间处理body


写链式操作
 const server = require('express');
 server.get((req, res, next) => {req.query});
 server.post((req, res, next) => {req.body});
 server.use((req, res, next) => {});

 server.use('/', (req, res, next) => {
     next();  //执行下一步
 });

server.use('/', (req, res, next) => {
    
 });


 eg: next下一步
 const express = require('express');
 const server = express();

server.get('/home', (req, res, next) => {
    res.write(JSON.stringify(req.query));
    console.log(req.query);
    next();
});



server.get('/home', (req, res, next) => {
res.write('next下一步');
res.end();
});

server.listen(8080);

=================================================>>> http - 无状态的

express: 1.数据 2.中间件 3.cookie: 在浏览器保存一些数据, 每次请求都会带过来, 保存在浏览器里面

  • 不安全,用户在浏览器可以修改

  • 大小限制 (4K) 存在浏览器里面

  • 读取 --- cookie-parser - 1.引入 const cookieParser = require('cookie-parser'); - 2.注入 server.use(cookieParser('签名')); - 3.获取 req.cookies

  • 发送 --- res.cookie('user', 'blue', {path:'/aa', maxAge:30243600*10000}); ==> npm install ( res.cookie('usrename', 'clh', {path:'/',maxAge: 3000});)

eg:
const express = require('express');

const server = express();

server.use('/', (req, res) => {
    res.cookie('user', 'clh');


    res.end('okkk');
});


server.listen(8080);

4.session:

  • 保存数据,保存在服务端

  • 无限大小

  • *** session基于cookie出来的

  • 设置 --- cookie-session ==> npm install const cookieParser = require('cookie-parser'); const cookieSession = require('cookie-session');

    server.use(cookieParser()); // ==>>注入cookie
    server.use(cookieSession({   //===>>设置session的加密方式
        keys: ['a', 'b', 'c'],   // ===>>  设置签名
        name: 'sess', //==>>别名
        maxAge: 2000, //==> 有效期时间,  防止破解session
    }));
    

    读取: req.session

    删除: delete req.session 在服务器端

session:基于cookie实现的: cookie中会有一个session的ID, 服务器利用sessionId找到session文件、读取、写入

  ***隐藏:  session劫持

res.end() 和res.send()区别: 简单来说就是   如果服务器端没有数据返回到客户端 那么就可以用 res.end

但是 如果 服务器端有数据返回到客户端 这个时候必须用res.send ,不能用 res.end(会报错)

cookie总结: 1. cookie空间非常小 ------省着用 2.安全性非常差

1.精打细算

2.校验cookie是否被篡改过

  1. 发送cookie res.secret = 字符串; //签名 res.cookie('user' ,'clh', {path:'/', maxAge:毫秒[过期时间], signed:true/false[是否签名]}) path:读取路径, 上面可以读取下面,下面不可以读取上面的

  2. 读取cookie const cookieParser = require('cookie-parser'); server.use(cookieParser('秘钥));

    sever.use(req => { console.log(req.cookies): 未签名版 console.log(req.signedCookies): 签名版 })

  3. 删除cookie 服务端通知浏览器进行删除cookie res.clearCookie(名字) res.clearCookie('usrename'); 清除

NODE.js模板引擎 ==>生成页面的 jade - 破坏式、 侵入式的, 强依赖 ejs - 温和, 非切入式的、弱依赖 blog.csdn.net/zhanghuiqi2…

npm install jade

渲染 jade.render('html'); jade.readFile('模板文件名', {pretty: true}); 从文件里面读取模板 文件扩展名为 .jade

   - 根据缩进,规定层级 
   - 属性放在()里面, 多个逗号分隔    a(href='a.css', rel='stylesheet')
        - 行内style可以使用json对象   div(style='color:red;font-size:12px')  div(style='{color:red}')
        - class 用数组   div(class='a, b, c, d');   div(class=['a, b, ,c, d']);
   - 内容空个空格,直接往后堆   div 首页

html  <html></html>
eg:


    ol
        li
            a   
                img

    const jade = require('jade');
    let s = jade.renderFile('./1.jade', {pretty: true});
    console.log(s); 
    <ol>
    <li><a><img/></a></li>
    </ol>

ejs: 非破坏,非侵入式的 ejs.render(); ejs.renderFile('模板路径', {模板数据}, (err, data)=>{}); include用法 <% include ./note.txt %> ***需要指定路径 ./ 、 ../ 里面不能写变量,不识别

输出:   %= 输出变量的值    %-不转义输出  %include引入文件
    <%= name %> 
    <%- name %>  不转义输出
    <%= ary[0].name %> 
    <%= 12 + 5 %> 


    引入文件: <% include  ./jade.txt %>


    eg===>>:
            <%= name %>

            <ul>
            <% for (let i=0;i<ary.length;i++) {  %>
                    <li><%= ary[i] %></li>
            <% } %>

            </ul>



            ejs.renderFile('./1.ejs', {name:'ejs', ary:[1,2,3,4]}, (err, data) => {
                if (err) {
                    console.log(err);
                }

                console.log(data);
            });

express: 1.主体 2.cookie、session 3.数据交换 Get/Post 4.模板引擎 jade、 ejs 5.body-parse 解析post数据 解析post文件

npm install express express-static body-parser cookie-parser cookie-session ejs jade

内置模块: => http模块

1.创建服务

  1. 引入http模块 const http = rquire('http');

  2. 创建服务 http.createServer() Request: 请求 输入-请求的信息, 请求的字段 - request.url 得到请求的路径 http://localhost:8080/home.index =>/home.html

    Response: 响应 输出-输出的东西 - response.write(); 返回东西给前端 - response.end(); 结束请求

    http: 协议

    eg:

    const http = require('http'); http.createServer((req, res) =>{ var url = req.url; if (url ==='/index.html') { res.write('index page'); } else if(url ==='/list.html') { res.write('list page') } res.end(); }).listen(8080);

参数: 1. url.parse(req.url, true).query 2. queryString.parse(url) 3. express.js req.query

2.文件处理 fs模块 file sysment 文件系统

都是异步的:

读文件 => fs.readFile(文件名路径, (err, data) => {}); Buffer二进制流,toString()转为 写文件 => fs.writeFile(文件名路径, 内容, err => {console.log(err)});

同步: 多个操作可以同时进行,前一次的操作没有完事,后一次也能开始 异步: 一次一个执行

3.数据请求 前后台交互 http协议: 前台: form、 ajax、 jsonp 后台: 一样 请求方式:
Get 参数在url上面 Post 参数在请求体里面 Put Delete Update url模块 ==> 模块 const urlLib = rquire('url'); 格式化URL参数: url.parse(str[, true]); 默认不解析query, true自动解析query为对象

let str = 'http://baidu.com:8080/home.html?name=clh&age=26'
获取URL信息 const urlLib = url(request.url(), true);
console.log(urlLib.parse());
protocol: 'http:',
slashes: true,
auth: null,
host: 'baidu.com:8080',
port: '8080',
hostname: 'baidu.com',
hash: null,
search: '?name=clh&age=26',
***query: 'name=clh&age=26',
***pathname: '/home.html',
path: '/?name=clh&age=26',
href: 'http://baidu.com:8080/?name=clh&age=26'

eg: const http = require('http'); const url = require('url'); http.createServer((req, res) => { let urlLib = url.parse(req.url, true); console.log(urlLib); }).listen(8080);

后台接收数据情况: 1. ===================>> Get 方法穿参数, 转对象 数据在请求头里面 url参数 - 自己写方法封装 - querystring模块, 只能解析?后面的东西 xxx=xx&xx=xx queryString; {xxx:xx, xx:xx} - url.parse(urlstr[, true]) 能解析好多 aa=?xx=xx&xx=12 ***query: 'name=clh&age=26', ***pathname: '/',

2. =================>> Post 方法穿参数,    转对象     数据在请求体里面
    Get方式数据: req.url--urlLib.parse(url, true);


    POST数据接收: POST数据比GET大的多

    POST很大 -- 分段接收 

  
    const str = '';
    //==>> 'data'自定义是事件  data是这一次接收的参数
    当有一段数据到达的时候执行
    request.on('data', data => {
        str += data;
    });

    数据全部到达(一次)
    request.on('end', () => {
        console.log(querystring.parse(str)); //输出接收的参数
    });

eg: const http = require('http'); const querystring = require('querystring');

http.createServer((req, res) => {
    let str = '';
    req.on('data', data=>{
        str += data;
    });

    req.on('end', () => {
        let POST = querystring.parse(str);
        console.log(POST);
        res.end();
    });
}).listen(8080);

4.案例 内置模块: http, url, fs, querystring GET,POST数据传送

用户注册、登录

接口: /user?act=reg$user=clh&pass=123456 {"OK", false, "msg":"失败原因"}

/user?act=login$user=clh&pass=123456
{"OK", true, "msg":"失败原因"}

对文件的访问: http://localhost:8080/1.html http://localhost:8080/1.jpg http://localhost:8080/ajax.js

对接口的访问: http://localhost:8080/user?act=reg http://localhost:8080/user?act=login

http知识: segmentfault.com/a/119000000…

====================================== NODE.JS模块化 ============================================

1.系统模块:
-http - url - fs - querystring - Crypto加密 - Events 事件 - Debugger 调试程序 - Net网络操作, 发邮件... - OS操作系统信息 - Path 处理文件路径 - Stream 流操作 - Buffer 二进制流 - Timers 定时器 setTimeout/setInterval - ZLIB 压缩文件, 2.自定义模块: 1). 模块组成 2). npm 3). 发布自己的模块 3.包管理工具: NPM

  1. 统一下载路径
  2. 自动下载依赖
  3. node_modules 下载的模块

npm使用: npm install xxx 安装模块 npm uninstall xxx 卸载模块 npm update xxx 更新模块

NODE里面的模块知识:
    require  引入模块
    - 引入当前自定义模块加入./  let modeule1 = require('./module.js');   
    - 默认导入内置模块, 引入自定义模块加入当前路径 ./
    - .js可以省略,因为NODE.js里面的模块都是js文件

        引入文件有./
            当前目录找

        ***引入文件没有./
            先从系统模块中找, 如果没有在到node_modules文件夹里面找   (系统模块优先))


    module.exports 模块        批量输出    exports.a = 1;   es6 export var a = 1;
    exports 导出模块           一个个输出  module.exports = {}  module.exports = function() {} ... 导出多种类型     module.exports = {} 自己定义的内存地址,将之前的地址覆盖了

    node_modules 模块放这里
  • NODE.js里面没有全局变量,都是模块,全局对象Global,可以给他加一些公用的属性和方法,各个模块可以使用
  • 每个模块都是内置一个闭包,包起来了,所以没有全局变量了, //===>> js没有模块的机制,但是可以通过闭包将全局变量封装起来,成了局部变量 ;((require, exports, module)=>{ let a = 1; let b = 2; expots.a = a ; })();

发布自己的模块: npm login 登录npm网站 npm init 初始化配置文件 (模块说明) npm publish 发布模块 npm unpublish --force 删除摸模块

======================================================================== express.js 框架 ============================================================== express框架:

  1. 依赖中间件
  2. 接收请求
    • get/post/use

    • get('地址', (req, res)=>{}) 3.非破坏式的 req.url , req.body 参数获取 4.static用法 下载 npm install express-static 引入const static = rquire('express-static'); 使用 server.use(static('./www')) express保留了原生的功能,添加了一些方法(send), 增强原有的功能 1.安装 npm install express 2.配置 3.接收请求 4.响应请求

      非侵入式 ,在原生的基础上添加了一些功能 req res

      原生: res.write(); res.end();

      express: res.send(); res.end();

1.创建服务 const express = require('express'); //引入express.js 模块 const server = express();

2.监听端口 server.listen(8080);

3.处理请求 server.use('地址', (req, res) => { let info = req.query() 获取参数 == > req.parse(req.url, true); req.url 得到URL });

三种方法: server.get('地址', (req, res) => {}) get请求 server.post('地址', (req, res) => {}) post请求 server.user('地址', (req, res) =>{}) get/post都可以

express再次学习: 1. 数据 Get, Post req.query 无需中间件 2.中间件:使用,写链式操作 req.body 需要中间件 body-parse const bodyParse = require('body-parser'); 第一步:解析body数据,请求体里面的 => server.use(bodyParse.urlencoded({ extended: true/false, //设置模式 limit: 100K(默认) //限制接收范围多大
})); 第二部: 使用server.use(req => req.body)

express.js
express-static
中间件: body-parser  处理POST的  中间处理body


写链式操作
 const server = require('express');
 server.get((req, res, next) => {req.query});
 server.post((req, res, next) => {req.body});
 server.use((req, res, next) => {});

 server.use('/', (req, res, next) => {
     next();  //执行下一步
 });

server.use('/', (req, res, next) => {
    
 });


 eg: next下一步
 const express = require('express');
 const server = express();

server.get('/home', (req, res, next) => {
    res.write(JSON.stringify(req.query));
    console.log(req.query);
    next();
});



server.get('/home', (req, res, next) => {
res.write('next下一步');
res.end();
});

server.listen(8080);

=================================================>>> http - 无状态的

express: 1.数据 2.中间件 3.cookie: 在浏览器保存一些数据, 每次请求都会带过来, 保存在浏览器里面

  • 不安全,用户在浏览器可以修改

  • 大小限制 (4K) 存在浏览器里面

  • 读取 --- cookie-parser - 1.引入 const cookieParser = require('cookie-parser'); - 2.注入 server.use(cookieParser('签名')); - 3.获取 req.cookies

  • 发送 --- res.cookie('user', 'blue', {path:'/aa', maxAge:30243600*10000}); ==> npm install ( res.cookie('usrename', 'clh', {path:'/',maxAge: 3000});)

eg:
const express = require('express');

const server = express();

server.use('/', (req, res) => {
    res.cookie('user', 'clh');


    res.end('okkk');
});


server.listen(8080);

4.session:

  • 保存数据,保存在服务端

  • 无限大小

  • *** session基于cookie出来的

  • 设置 --- cookie-session ==> npm install const cookieParser = require('cookie-parser'); const cookieSession = require('cookie-session');

    server.use(cookieParser()); // ==>>注入cookie
    server.use(cookieSession({   //===>>设置session的加密方式
        keys: ['a', 'b', 'c'],   // ===>>  设置签名
        name: 'sess', //==>>别名
        maxAge: 2000, //==> 有效期时间,  防止破解session
    }));
    

    读取: req.session

    删除: delete req.session 在服务器端

session:基于cookie实现的: cookie中会有一个session的ID, 服务器利用sessionId找到session文件、读取、写入

  ***隐藏:  session劫持

res.end() 和res.send()区别: 简单来说就是   如果服务器端没有数据返回到客户端 那么就可以用 res.end

但是 如果 服务器端有数据返回到客户端 这个时候必须用res.send ,不能用 res.end(会报错)

cookie总结: 1. cookie空间非常小 ------省着用 2.安全性非常差

1.精打细算

2.校验cookie是否被篡改过

  1. 发送cookie res.secret = 字符串; //签名 res.cookie('user' ,'clh', {path:'/', maxAge:毫秒[过期时间], signed:true/false[是否签名]}) path:读取路径, 上面可以读取下面,下面不可以读取上面的

  2. 读取cookie const cookieParser = require('cookie-parser'); server.use(cookieParser('秘钥));

    sever.use(req => { console.log(req.cookies): 未签名版 console.log(req.signedCookies): 签名版 })

  3. 删除cookie 服务端通知浏览器进行删除cookie res.clearCookie(名字) res.clearCookie('usrename'); 清除

NODE.js模板引擎 ==>生成页面的 jade - 破坏式、 侵入式的, 强依赖 ejs - 温和, 非切入式的、弱依赖 blog.csdn.net/zhanghuiqi2…

npm install jade

渲染 jade.render('html'); jade.readFile('模板文件名', {pretty: true}); 从文件里面读取模板 文件扩展名为 .jade

   - 根据缩进,规定层级 
   - 属性放在()里面, 多个逗号分隔    a(href='a.css', rel='stylesheet')
        - 行内style可以使用json对象   div(style='color:red;font-size:12px')  div(style='{color:red}')
        - class 用数组   div(class='a, b, c, d');   div(class=['a, b, ,c, d']);
   - 内容空个空格,直接往后堆   div 首页

html  <html></html>
eg:


    ol
        li
            a   
                img

    const jade = require('jade');
    let s = jade.renderFile('./1.jade', {pretty: true});
    console.log(s); 
    <ol>
    <li><a><img/></a></li>
    </ol>

ejs: 非破坏,非侵入式的 ejs.render(); ejs.renderFile('模板路径', {模板数据}, (err, data)=>{}); include用法 <% include ./note.txt %> ***需要指定路径 ./ 、 ../ 里面不能写变量,不识别

输出:   %= 输出变量的值    %-不转义输出  %include引入文件
    <%= name %> 
    <%- name %>  不转义输出
    <%= ary[0].name %> 
    <%= 12 + 5 %> 


    引入文件: <% include  ./jade.txt %>


    eg===>>:
            <%= name %>

            <ul>
            <% for (let i=0;i<ary.length;i++) {  %>
                    <li><%= ary[i] %></li>
            <% } %>

            </ul>



            ejs.renderFile('./1.ejs', {name:'ejs', ary:[1,2,3,4]}, (err, data) => {
                if (err) {
                    console.log(err);
                }

                console.log(data);
            });

express: 1.主体 2.cookie、session 3.数据交换 Get/Post 4.模板引擎 jade、 ejs 5.body-parse 解析post数据 解析post文件

npm install express express-static body-parser cookie-parser cookie-session ejs jade

================================================== 模板引擎: 适配 ======================================= consolidate

const consolidate = require();

server.set('view engine', 'html'); // => 全局配置, html输出

server.set('views', '模板所在的目录'); //=> 设置模板文件

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

server.get('/', (req, res) =>{ res.render('模板文件', 数据{}):

render(); //== >渲染输出

});

eg: const express = require('express'); const server = express(); const consolidate = require('consolidate');

server.set('view engine', 'html');   //服务全局配置

server.set('views', './views');  //设置模板路径

server.set('html', consolidate.ejs);   //设置输出文件类型, 及使用的模板

server.use('/index.html', (req, res) => {
   res.render('a.ejs', {name: 'Node.js'});   // render渲染模板文件
});


server.listen(8080);

================================================== 路由 =======================================

  1. 路由是什么? router-路由 把不同的目录, 对应到不同的模块

路径: 模块: xxxx.com/aaa/ mod xxxx.com/news/ mod_news 二级子模块: 二级路由 post发布新闻 news_post list 新闻列表 news_list content 新闻 news_content xxxx.com/user/ mod_user

server.get(); server.post(); server.use(); 中间件

Router ----- 迷你server router.get() router.post() router.use();

Router ----- 拆分 子服务 /user/ mod_user /item/ mod_item

使用步骤: 1.创建router let router = express.Router()

2.把router添加到server中
   server.use('/user', router);

3.监听
   router.get('/1.html')
   router.post('/2.html')


 eg:
   利用JS的三种角色,  <<< 类 、 对象 、 普通函数 >>
 const express = require('express');
 const  server = express();   //express执行返回一个对象,里面包含好多方法


console.dir(express);  //用面向对象的方式查看express方法和属性
console.dir(express.prototype);

 const UserRouter = express.Router();   //express的静态方法, Router返回一个路由的实例
 const HomeRouter = express.Router();
 server.use('/user', UserRouter);

 UserRouter.get('/login', (req, res) => {
     res.send('login');
 });
 UserRouter.get('/resigt', (req, res) => {
     res.send('resigt');
 });

 UserRouter.get('/home', (req, res) => {
     res.send('home');
 });
 server.listen(8080);   // ==>> 原型上的方法

============================== body-parse 的问题 ========================== body-parse 只能解析post数据,不能解析文件 只能处理urlencoded 类型

解决办法: multer 中间件, 处理上传文件的 处理 multipart/form-data 类型的

用法:

  1.  const multer = require('multer')  引入

      定义一个对象  let objMulter = multer(
        {
            dest: './upload'    // ===>>上传文件放到磁盘哪里
        }
      );  //返回一个对象,里面好多方法

  2.  server.use(objMulter.any());                使用

  3.  读取 req.files    上传文件对象  {fieldname: 'f1'}

  4.  文件重命名  fs
   fs.rename('a.txt', 'b.txt', (err, data) =>{
          //将文件a.txt 重命名为b.txt
   });


   path模块:
   const path = require('path');
   let str = 'C:\\wamp\\www\\a.html'
       basename:  文件名部分  a.html
       extname:   扩展名部分   html
       dir:  文件路径    C:\\wamp\\www
       name:文件夹不包括扩展名  a

form表单里面的 enctype类型 - application/x-www-form-urlencoded 上传值, ?a=1&b=2 - multipart/form-data 上传文件分割多个部分,上传表单真正数据 - text/plain 充文本