一、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.创建服务
-
引入http模块 const http = rquire('http');
-
创建服务 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
- 统一下载路径
- 自动下载依赖
- 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框架:
- 依赖中间件
- 接收请求
-
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是否被篡改过
-
发送cookie res.secret = 字符串; //签名 res.cookie('user' ,'clh', {path:'/', maxAge:毫秒[过期时间], signed:true/false[是否签名]}) path:读取路径, 上面可以读取下面,下面不可以读取上面的
-
读取cookie const cookieParser = require('cookie-parser'); server.use(cookieParser('秘钥));
sever.use(req => { console.log(req.cookies): 未签名版 console.log(req.signedCookies): 签名版 })
-
删除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.创建服务
-
引入http模块 const http = rquire('http');
-
创建服务 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
- 统一下载路径
- 自动下载依赖
- 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框架:
- 依赖中间件
- 接收请求
-
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是否被篡改过
-
发送cookie res.secret = 字符串; //签名 res.cookie('user' ,'clh', {path:'/', maxAge:毫秒[过期时间], signed:true/false[是否签名]}) path:读取路径, 上面可以读取下面,下面不可以读取上面的
-
读取cookie const cookieParser = require('cookie-parser'); server.use(cookieParser('秘钥));
sever.use(req => { console.log(req.cookies): 未签名版 console.log(req.signedCookies): 签名版 })
-
删除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);
================================================== 路由 =======================================
- 路由是什么? 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 充文本