传输协议
- HTTP:超文本传输协议,除了文本还可以传输其他东西,例,XML等
- HTTPS:更加安全的HTTP
- FTP:文件传输协议(应用于把项目源文件传递到服务器上)
在不指定服务器端口的情况下,每一种协议会有一个默认找的地址
- HTTP默认会找服务器的80端口
- HTTPS默认会找服务器的443端口
- FTP默认会找服务器的21端口
URL
URL:统一资源定位符
http://v.qq.com:80/index,html?name=zhufeng#bbs
-> http:传输协议 ->客户端给服务端的内容和服务器传递给客户端的内容都是通过http传输协议进行传输
-> v.qq.com :域名(请求本机域名时在window窗口下输入ipconfig,找网站的域名,输入ping xxx.com)
-> 80 :端口号
-> index.html : 请求资源文件名 ->告诉服务器我需要请求的资源文件是谁
->?name=zhufeng :URL问号传参 ->客户端传递给服务端的内容
->#bbs :URL的hash(锚点定位)
NODE
一. 是一个基于Chrome v8的环境,供js代码执行的环境,可以等价于浏览器,通常把NODE这个环境安装到服务器端
二. node&&浏览器
- node采用谷歌的v8引擎来渲染js(运行速度快,稳定,编写的js不需要考虑兼容)
- 浏览器中的全局JS对象是window,而NODE环境下全局对象是Global
- 浏览器是安装在客户端的,为了保证客户端的安全,基本上不可能提供JS对客户电脑磁盘上的文件进行操作的功能;但是NODE环境中提供了对应的I/O操作,我们使用js可以对服务器磁盘下的文件及逆行增删改查
- node提供给js很多新的方法: http.creatServer、fs.writeFileSync …
- NODE是基于事件驱动的/异步编程
三.如何让js代码在node中执行
在命令窗口中执行:在当前要执行的js文件目录下,shift+右键 => 在此处打开命令窗口 => node xxx.js => ctrl+c 重新操作
这种错误是80端口被占用
在命令窗口中打开node文件(cd …) ,然后开始编写对应代码,输入node xxx.js,执行js代码,代码中console.log输出在命令窗口中出现
四.NODE模块
1.什么是模块?
node.js中所有的功能都是以模块形式的,一个文件就是一个模块
模块与模块之间相互独立,使用模块需要引入
2.主模块
主模块是整个项目的模块,主模块对整个项目的其他模块进行统筹调度。 一个项目只允许有一个主模块
3.模块组成
所有用户编写的代码都放在模块中,模块就是文件(函数),用户编写的代码都自动封装在一个函数中
/*
模块的组成,封装在一个函数中,函数中有5个参数,如下图
exports:暴露对象,jiangmokuaideshuju暴露给引入的地方
require:引入模块的函数
module:模块对象,包括当前模块的所有信息
_filename:当前模块的文件名
_dirname:当前模块所在的路径(目录路径)
*/
console.log(arguments.callee.toString());
npm:(NodeJS Package Manager):包管理器
1.统一下载途径
2.自动下载依赖
npm install xxx | 安装xxx
npm uninstall xxx | 卸载xxx
node_modules
存放模块:可以存自己的,也可以存放下载的模块
自定义模块统一都放到node_modules里面,引入时不用加**.js**
npm
npm init :初始化
npm install xxx / npm i xxx :安装包
npm uninstall :卸载
npm publish :上传包
npm --force unpublish :删除已经上传的包(在库中)
npm i xxx --save :将安装包写入package.json依赖列表
npm search xxx :搜索包
npm view xxx :查看包
package.json
package.json是node.js项目的描述文件
- 如何创建package.json?
npm init //然后写上要求的内容
npm init -y //自动以全部yes形式生成package.json
控制台命令
console.log();普通输出
console.dir();
console.assert(表达式,输出文字); 断言,当表达式为假时,输出文字
console.error();警告输出
console.time(标识); 计时开始
console.log.timeEnd(标识); 计时结束
4.模块分类
内置模块 :HTTP(creatServer…)、fs(writeFileSync、readFileSync…)、url …
自定义模块:自己定义的模块
第三方模块:别人写好的模块,我们拿来使用 ->在node中如果需要使用别人的模块,需要使用npm(NodeJS Package Manager)这个命令进行管理
引入自定义模块时,必须加**./,在当前目录下引入,不加./**时,从系统模块,或者从node_modules中找。
require:引入模块
不存在全局变量,想要输出一个东西加exports,eg:exports.a =12; exports.方法名=函数,不能改指向,是对module.export的引用。
module:用来批量输出,真正的暴露对象eg:moudle.exports={a:12,b:23,c:21};
- modele.exports = 对象或函数; module.exports.方法= 函数
module.id :模块id
moudle.parenr :模块父级
module.filename :模块的文件名和路径
module.paths : 模块查找路径
promise
ES6中新增的承诺对象
状态:
Pending :等待中
Resolved :成功
Rejected :失败
path
1.path.join(); //拼接地址
2.path.dirname(); //返回路径中的文件夹部分
3.path.parse(); //解析
var path = require('path');
var p2 = './node/static/js.html';
console.log(path.join('code',p2));//p2\node\static\js.html
console.log(path.dirname(p2));//.\node\static
console.log(path.parse(p2));
path.parse
五.导入内置模块(require)
var http = require(“http”),
fs = require(“fs”),
url = require(“url”);
- fs.readFile(文件名,回调函数)
//读取文件信息
const fs = require("fs");
//readFile(文件名,回调函数)
fs.readFile('1.txt',function(error,data){
if(error){
console.log('读取失败');
}else{
console.log(data.toString());
}
});
2.fs.writeFile(文件名,内容,回调函数)
const fs = require('fs');
//writeFile(文件名,内容,回调函数)
fs.writeFile('write.txt',"this is content",function(error){
console.log(error);
})
3.fs.stat(文件名,回调函数) //读取文件信息
const fs = require('fs');
fs.stat('./sjq.txt',function(err,state){
console.log(state);
});
4.fs.unlink(文件路径,回调函数)
const fs = require('fs');
fs.unlink('./sjq1.txt',function(err){
if(err){
throw err;//抛出错误
}else{
console.log('删除成功!');
}
});
5.require注意事项
当引入的模块有语法错误时,会报错
当引入的模块路径有误时,会报错
当一个模块被多次引入时,只执行一次
//fs.readFileSync([path+name].[encode]):同步读取文件指定中的内容 (同步读取:文件中的内容读取不完不执行下面的操作,只有都读取出来才会执行后续的操作 )
if(pathname ==="/xxx.html"){
var con = fs.readFileSync("./xxx.html","utf-8");
//response(响应):提供了向客户端返回内容和数据的方法
//response.write:向客户端返回内容
//response.end:告诉服务器响应结束
response.write(con);
response.end;
}
cookie(小饼干)
在浏览器保存一些数据(不安全),每次请求都会带过来,有限的(4k)
- 读取:
- 发送:
session
保存数据,保存在服务端(安全),无限的,基于cookie来实现的
隐患:session劫持
六.详情
- HTTP
http.createServer:创建一个服务
server.listen :为这个服务监听一个端口
var server = http.creatServer();
server.listen(8080);
var server = http.createServer(function (){
//当客户端向服务器端的当前服务(端口号80)发送一个请求,并且当前服务已经成功接收到这个请求后执行这个回调函数
//request(请求):存放的是所有客户端的请求信息,包含客户端通过问好传参的方式传递给服务器的数据内容
console.log(requst.url);
//request.url:存放的是客户端请求的文件资源的目录和名称以及传递给服务器的数据,eg:客户端请求的地址:http://192.168.0.32/index.html?name=zhu,我们服务端通过request.url获取到的是:/index.html?name=zhu
console.log('hahaha');
});
七.服务创建成功后,如何向服务端发送请求
在浏览器中输入http://localhost:端口号/
在浏览器中输入http://本机的IPv4地址(window+r 输cmd ->输入ipconfig):端口号/
八.实例
res.write():是在页面上打印出数据
res.end():是结束服务
var http = require("http"),
url = require("url"),
fs = require("fs");
//创建一个服务
var server1 = http.createServer(function (req, res) {
res.write("lalala");
res.end();
});
//为这个服务创建端口
server1.listen(180, function () {
console.log('creat success');
});
var http = require("http"),
url = require("url"),
fs = require("fs");
//创建一个服务
var server1 = http.createServer(function (req, res) {
//解析客户端请求地址中的文件目录名称以及传递给当前服务器的数据内容
var urlObj = url.parse(req.url, true),
pathname = urlObj["pathname"],
query = urlObj["query"];
//如果不加try catch,客户端请求资源文件不存在时,服务会终止
try{
var con = fs.readFileSync("." + pathname,"utf-8");
res.end(con);
}catch(e){
res.end("request file is not find!");
}
/*以下三种合并为上面情况
if(pathname === "/index.html"){
var con = fs.readFileSync("./index.html","utf-8");//Sync同步读取文件内容,aSync异步
res.end(con);
return;
}
if(pathname === "/index1.css"){
con = fs.readFileSync("./index1.css","utf-8");
res.end(con);
return;
}
if(pathname === "/index.js"){
con = fs.readFileSync("./index.js","utf-8");
res.end(con);
return;
}*/
});
//为这个服务创建端口
server1.listen(8080, function () {
console.log('server is creat success,listening on 180 port!');
});
九.MIME类型
- 每一种资源文件都有自己的标识类型,eg:HTML文件的MIME类型是"text/html",TXT–>“text/plain”…
- 浏览器会按照它的MIME类型进行渲染
十.处理静态资源文件的请求(html/css/js…)
var http = require("http"),
url = require("url"),
fs = require("fs");
//创建一个服务
var server1 = http.createServer(function (req, res) {
//解析客户端请求地址中的文件目录名称以及传递给当前服务器的数据内容
var urlObj = url.parse(req.url, true),
pathname = urlObj["pathname"],
query = urlObj["query"];
//如果不加try catch,客户端请求资源文件不存在时,服务会终止
//处理静态资源文件的请求==>"前端路由"
var reg = /\.(HTML|JS|CSS|JSON|TXT|ICO)/i;//图片也是jpg...
if(reg.test(pathname)){ //获取请求文件的后缀名
var suf = reg.exec(pathname)[1].toUpperCase();//根据请求文件的后缀名获取到当前文件的MIME类型
var sufMIME = "text/plain";
switch (suf) {
case "HTML":
sufMIME = "text/html";
break;
case "CSS":
sufMIME = "text/css";
break;
case "JS":
sufMIME = "text/js";
break;
case "JSON":
sufMIME = "application/json";
break;
case "ICO":
sufMIME = "application/octet-stream";
break;
}
try{
var conFile = fs.readFileSync("." + pathname,"utf-8");//按照指定的目录读取文件中的内容(都是字符串格式)
//重写响应头信息:告诉客户端的浏览器返回的内容是什么样的MIME类型,指定内容格式是utf-8编码,返回的汉字不会出现乱码
res.writeHead(200,{'content-type':sufMIME + '; charset=utf-8;'});
res.end(conFile);
}catch(e){
res.writeHead(404,{'content-type':'text/plain; charset=utf-8;'});
res.end("request is not found!");
}
}
});
//为这个服务创建端口
server1.listen(180, function () {
console.log('server is creat success,listening on 180 port!');
});
十一.HTTP报文
客户端传递给服务端的内容和服务端传递给客户端的内容都属于HTTP报文
起始行 :请求起始行 响应起始行
首部 :请求首部 响应首部 通用首部(请求响应都) 自定义首部‘
主体 : 请求主体 响应主体
在控制台中:network下,name
请求首部
响应首部
响应主体,请求主体
(1).客户端传递给服务器端数据
请求URL后面问号传参的方式
设置请求的首部
设置请求主体,把传递给服务器的内容放在请求主体中传递给服务器
(2).服务端传递给客户端数据
设置响应头信息
设置响应主体内容
express框架
保留了原生的功能,添加了一些方法(send),增强了原有功能
1.创建项目及使用:
express -e 项目名称
安装依赖cnpm i xxx,在package.json中查看
开启项目 :npm start -->变成node ./bin/www
2.目录
public :静态文件根目录,优先找静态页面
routes :路由模块目录,动态文件的目录
views :试图目录,存储所有的ejs
3.基本过程:
1.创建服务
var server = express();
2.监听
server.listen(8080);
3.处理请求
server.get(‘地址’,function(req,res){})
server.post(‘地址’,function(req,res){})
**server.use(‘地址’,function(req,res){})**使用use前面的方法都可以接收