node.js简介
简单来说node.js就是js的一个运行环境,可以运行js代码,用于服务器端编程。
下载安装
下载node.js
安装:一路next
环境变量会自动配置,不放心的话可以自己查看一下。
验证:
运行cmd:
node -v
node使用
进入项目目录运行cmd
node 文件名(.js)
.js
可写可不写,因为node能且仅能运行js文件
或 运行cmd
node
编写js代码
模块组成
node.js提倡我们进行模块化编程
所有用户编写的代码都放在模块中,模块就是文件(函数)
用户编写的代码在nodejs运行时都会自动放在一个函数中,所以一个文件就是一个模块
用户编写的代码都自动封装在一个函数中
function(exports,require,module,_filename,_dirname){}
函数有五个参数:
exports 暴露对象,可以将模块中的数据暴露给引入的地方
require 引入模块的函数, 用于在一个模块中引入另外一个模块,并且将子模块暴露的数据赋值给变量
module 模块对象, 包含了当前模块的所有信息
__filename 当前模块的文件 名
__dirname 当前模块所在的路径(目录路径〉
nodejs的模块是指所有用户编室的代码都放在函数中,所有定义的函数或变量都是局部的,相互之间不受影响。如果模块之间需要共享数据,则需要使用module.exports
是暴漏对象。
require :
作用:在当前模块中加载另外一个模块
模块分类:
自定义模块
我们自己编写的文件就是一个自定义模块
注意:
子模块没有暴漏数据,返回空对象
自定义模块必须加
./
(指向当前模块)因为在node.js中查找模块默认在node_modules目录中去查找
第三方模块
第三方程序员或公司开发的模块,先安装再使用
安装可以使用npm包管理工具
npm install <包的名字>
引入 require(“模块名”)
系统模块
node.js开发团队已经开发好的功能模块,直接引入即可使用,不需要安装也不需要自己写
例如:
fs http url path ….
引入 require(“模块名”)
require函数的注意事项:
1) 当引入的模块有语法错误时,会报错。
2) 当引入的模块路径有错时,也会报错。
3) 当一个模块被多次引入时,只执行一次,会将暴露对象直接写入缓存,以后就直接从缓存读取
exports导出对象:
作用:将模块中需要共享给其它模块的数据暴露(导出)到引用处
语法:
exports.属性名=值;
exports .方法名=函数;
注意:
1) exports 是module.exports对象的引用
2) exports 是module.exports的引用,不能改指向,只能添加属性和方法S
3) module.exports才是真正的暴漏对象,指向哪里就暴漏哪里
module模块对象:
module.exports
真正的暴露对象, exports对象只是对它的引用。
module.exports.属性=值;
module.exports.方法=函数;
module.exports=对象或函数;
module.id模块ID, 模块名称
module. parent模块的父级
module. filename模块的文 件名和路径
module.children子模块列表
module. paths模块查找路径,如果当前目录下找不到node_ modules就去上一级目录查找,直到根目录如果配置了NODE_ PATH环境变量, 则会再去环境变量指向的路径查找
控制合命令:
console.1og() 普通输出语句
console.dir() 输出对象
console.errar() 警告输出
console.time(标识) 计时开始
console.timeEnd(标识) 计时结束
console.assert(表达式,输出文字) 当表达式为假时,输出文字
node. js的作用域:
由于node.js在执行里会将用户编写的所有代码都封装在函数中,所有用户定义的变量或函数都是局部的。
要将数据共享给其它模块使用:
1.暴露对象
module.exports
2.全局对象
global.工性或方法=值;
注意:使用时global关键字可以省略不写
npm
什么是NPM
npm(Node Package Manager)是基 于nodejs的包管理工具
一般node.js自带npm不需要自己在单独配置
测试:打开cmd
npm -v
下载的文件存放的目录一般是node_modules
什么是包
包===项目 模块===文件
创建package.json
npm init
npm init -y //自动以全部为yes的形式生成package.json文件
package.json简介
package.json是node. js项目的包描述文件,以JSON格 式的形式描述项目
package.json的常用属性
name 项目名称
version 版本号
description 项目描述
main 主模块(入口文件)
dependencies 依赖列表
devDependencies 开发时依赖
scripts 脚本命令, 可以使用npm命令进行执行
license 开源协议
contibutors 包的其他贡献者姓名。
npm的常用命令
安装命令
npm install <包的名称> //安装指定的包(package.json文件中指定的依赖dependencies)
npm i //自动下载package.json中的依赖
npm i <包的名称> , //效果同上,缩写形式
npm i <包的名称>@版本号 //安装指定版本的包
npm i <包的名称> -g //全局安装
安装位置: C: \Users \Administrator\AppData\Roaming \npm\node_ modules
我的位置已修改C:\Program Files\nodejs\node_global
npm i <包的名称> --save //将安装包写入package .json依赖列表
npm i <包的名称> --save-dev //将安装包写入package .json开发时依赖列表
//其它命令
npm search <包的名称> , /搜索包
npm view <包的名称> //查看 包的信息
npm uninstall <包的名称> //卸载包
npm update <包的名称> 更新包
不使用-g
只下载在当前目录,只有当前目录可用,使用-g
是全局下载,下载到整个电脑,所有目录均可使用,以后在使用就不需要下载
下载的版本号问题:
express": "^4.17. 1"
4.17.1:指定版本
~4.17.1:版本号>=4.17.1,^表示>=4.17.1,但是<4.18.x;即本次下载4.17.99
4.17.1 4.17. 2 4.17.99 4.18.22
^4. 17.1: 版本号>= 4.17.1,^表示>=4.17.1,但是<5.x.x,即本次下载4.19.23
4.17.1 4.17.2 4.17. 99 4.18.22 4.19.23 5.1.1
lastest:在所有范围内找最大的,即本次下载5.1.1
5.1.1 4.17. 1 4.17.2 4.17. 99 4.18.22 4.19.23
cnpm
npm 就是一个文件下载工具,默认情况下去 npmjs.com/github. com
下载资源
cnpm 由于在国内下载npmjs. com的数据非常慢,所以淘宝制作了一个npmjs.com的镜像(可以下载,不能上传),直接访问国内的网站下载较快用法和npm一毛一样。
安装:
npm install -g cnpm --registry=https://registry.npm.taobao.org
之后下载的话就使用cnpm用法跟npm一样
回调函数
什么是回调函数?
回调函数又称为回调,将a函数作为参数传入b函数中,b函数在执行过程中根据时机或条件决定是否调用a函数,a函数就是回调函数。
异步的三种实现方式:
1. 回调函数
回调函数不一定是异步,但是异步定有回调函数
2. 事件
3. promise
回调函数
//异步-定有回调函数
setTimeout(function(){
console.1og('....' );
}, 1000);
//回调函数不一定是异步
console. log( '1111');
var arr=[1,2,3,4];
arr.forEach(function(v,i){
console.1og(v);
});
console.1og('2222');
事件
事件源.on('事件名称',回调函数)
promise承诺对象:
什么是promise
promise是ES6中新增的承诺对象,用于对异步的操作进行消息的传递。
promise的状态
- Pending 等待中
- Resolved 成功
- Rejected 失败
- Pending => Resolved
- Pending => Rejected
promise有什么用?
promise可以用于传递异步消息
缓存区:
什么是缓存区
在内存中开辟-个临时区域用于存 储需要运算的字节码
创建缓存区
创建指定长度的缓存区
var buf = new Buffer(5);
按指定的数组(编码)创建缓存区
var buf=new Buffer([97,98,99,65,66]);
按指定字符创建缓存区
var buf=new Buffer( '字符串' ) ;
写入缓存区
buf.write('字符串' );
读取缓存区
buf.toString();
缓存区复制
buf.copy(buf2);
文件系统操作
读取文件
由于node.js是服务器端程序,必须要有读写文件操作,在客户端没有这样的功能。
文字读写有两种方式:
直接读取
将硬盘上的所有内容全部读入内存以后才触发回调函数
两种写法:
异步:
fs.readFile('./file1.txt',function(err.data){
console.log(data.toString());
});
同步:
var data = fs.readFileSync('./file.txt');
注意:一般同步的方法都是在异步的方法后面添加Sync
流式读取
下面会专门讲。
写文件:
同步版本
fs.writeFileSync('文件名','数据');
异步版本
fs.writeFile('文件名',数据,function(err){
//写完文件以后执行的代码
});
例
//文件读取
//如果要读写文件,必须使用文件系统模块(fs)
var fs=require('fs');
//直接读取文件---异步
fs.readFile('./file1.txt',function(err.data){
console.log(data.toString());
});
//同步
var data = fs.readFileSync('./file.txt');
console.log(data);
console.log(data.toString());
//异步写文件
var hello="<h1>Hel1o Node.js</h1>";
fs.writeFile( 'index.html', hello,function(err){
if(err){
throw err;
}else{
console.1og('文件写入成功');
}
});
读取文件信息
fs.stat(' ./file1.txt',function(err,state){
console.log(state);
});
属性解析
size 文件大小(字节)
mtime 文件修改时间
birthtime 文件创建时间
方法解析
isFile() 判断当前查看的对就是不是一个文件
isDirectory() 判断是不是一个目录
删除文件
fs.unlink('./jquery.js',function(err){
if(err){
throw err;
}else{
console.log( '删除成功') ;
});
例
需求:编写代码实现删除一个非空目录
使用代码删除某个文件夹,该文件夹不为空。
使用递归函数实现,逐层查询并清空文件再删除空文件夹
定义一个函数,用于实现递归调用。
删除空文件夹(删不掉,目录非空)
读取文件夹的内容(文件及文件夹列表)
遍历数组一个一个获取文件信息
判断是否为文件,如果是文件则删除
判断是否为目录,如果是目录就调用自己(递归的入口)
代码
function deldir(p){
//读取文件央的内容
var list=fs.readdirSync(p);
//遍历数组
for(var i in list){
//list[i]是当前目录中每个文件及文件夹的名称
var path=p+'/'+list[i]; //拼接 一个从(05.js)当前目录能查找到的路径
var info=fs.statSync(path);
if(info.isFile()){
fs.unlinkSync(path); //如果是文件则删除文件
}else{
arguments.callee(path);//如果不是文件就是目录,则调用自己再删除该目录
}
}
fs.rmdirSync(p); //删除空文件夹
}
deldir('./aa');
文件流
什么是流
所有互联网传输的数据都是以流的方式,流是一组有起点有终点的数据传输方式
流的操作
流式读取文件
一节一节的读取数据,一节64kb ==> 65536字节
以流的方式写文件
一节一节的写文件
例
读入流
//创建一个可以读取的流
var stream=fs.createReadStream('./file1.txt');
//绑定data事件,当读取到内容就执行
stream.on( 'data',function(a){
console.log('------------------');
console.log(a.length);
});
//读取流的事件: end完成事件
stream.on('end',function(){
console.log('数据读完了');
});
//读取流出错事件: error错误事件
stream.on('error',function(err){
console.log("读取出错");
//抛出错误
//throw err;
});
写入流
var fs=require('fs');
//创建一个可以写入的流
var stream=fs.createWriteStream('./file2.txt' );
//写入数据
stream.write('张三失踪了');
stream.write('李四也失踪了');
stream.write('王小五也疯了');
stream.end(); //以流的方式写入数据 必须显示的声明结束
//on是绑定时事件
//写入流的事件: finish 完成事件
stream.on('finish',function(){
console.log('写完了');
});
//写入流的事件: error 错误事件
stream.on('error',function(err){
console.log( '出错啦');
});
需求:实现大文件的复制
var fs=require('fs');
var s1=fs.createReadStream('./file3.txt');
var s2=fs.createWriteStream('./file6.txt');
//以流的方式
//以流的方式实现大文件复制,读取一节存一节
s1.on('data',function(a){
s2.write(a);
});
s1.on('end',function(){
s2.end();
console.log("文件复制已完成!") ;
});
//以管道的形式
s1.pipe(s2);
链式流:
将多个管道连接起来,实现链式处理。
需求:使用链式流实现大文件压缩!
代码
var fs=require('fs');
var zlib=require('zlib');
var s1=fs.createReadStream('./file3.txt');
var s2=fs . createWriteStream('./file3.txt.zip');
s1.pipe(zlib.createGzip()).pipe(s2);|
path模块
什么是path模块?
path模块是node.js中提供的一个系统模块,用于格式化或拼接一个完整的路径
path模块的常用方法
path.join() //将多 个字符串拼接成一-个完整的路径
path.dirname() / /返回路径中的文件夹部分
path.basename() / /返回路径中的文件部分(文件名和扩展名)
path.extname( ) / /返回路径中的扩展名部分
path.parse()/ / 解析路径:近回一个对象包含路径中的各个部分
URL模块:
什么是URL?
url全球统一资源定位符, 对网站资源的一种简洁表达形式,也称为网址。
URL 的构成
构成:
协议://用户名:密码@主机名.名.城:端口号/目录名/文件名.扩展名?参数名=参数值&参数名2=参数值2#hash
http协议的URL常见结构:
协议://主机名.名.域/目录名/文件名.扩展名?参数名=参数值&参数名2=参数值2#hash
https默认的端口号是443
http默认的端口号是80
node. js的URL模块
在node.js中提供了两套对于url进行处理的API功能。
老的node.js url模块
新的url模块 (WHATWG URL标准模块》
什么是网络
网络是一个共享、传输信息的虚拟平台。
什么是网络协议
每天有大量的数据在网络上传输,都需要遵循相应的规则,规则就是网络协议。
什么是http协议
http (hypertext transfer protocol) 即超文本传输协议,传输超文本内容(文字、图片、视频、音频、动漫…
http协议规定了数据在服务器与浏览器之间传输数据的格式和过程。
http协议规定 的细节
http协议是一种请求应答形式的协议,一次请求, 一次应答(响应)。
细节: 1. 定义了浏览器以什么格式向服务器发请求, 2. 定义了服务器以什么格式解析浏览器发送过来的数据, 1. 定义了服务器以什么格式响应数据给浏览器, 1. 定义了浏览器以什么格式解析服务器响应的数据
软件开发模式
单机软件
打开电脑就能用,不需要网络,如: HBuilder、Word.西图….
2) C/S软件
客户端Client /服务器端 Server
需要下载安装以后,才能连接网络使用,如:迅雷、QQ、微信....
3) B/S软件
浏览器BrowEr /服务器端 Server
打开网址直接使用,不需要安装,如:百度、淘宝、JD....
注意:所有浏览器发起的请求都是get方式,post请求只能通过表单提交发起
http模块:
- get方法
get方法用于模仿客户端从服务器获取数据
http.get('url',function(res){
//res是返回对象,接收到服务器响应的所有内容
});
网络爬虫程序
什么是爬虫?
网络爬虫又被称为网页蜘蛛或网络机器人,是一种按照一定的规则, 自动地抓取万维网信息的程序。
案例:写一个爬虫程序从nipic. com批量下载图片
url: http://www. nipic. com/ photo/jianzhu/ shinei/index. html
开发思路:
1)打开网页查看内容,找图片地址
找规律=>查看网页源代码
小图: http://img90.nipic. com/file/20180110/5792316151721347529 1.jpg
大图: http://pic152.nipic. com/fne/20180110/5792316_ _151721347529_ _2.jpg
2)编写代码实现打开网页,获取所有的html内容
3)通过正则表达式提取出有哪些图片地址
4)遍历图片地址数组,一个一个请求
5)将获取到的图片数据保存在硬盘上
代码:
var http=require('http');
http.get('http://www.nipic.com/photo/jianzhu/shinei/index.html',function(res){
var data=''; //定义一个变量用于存放一段一段的HTML数据
//以流的方式读取数据
res.on('data',function(a){
data+=a. toString();
};
//绑定end事件
res.on('end',function(){
//data 就是当前网页的HTML内容
//编写正则表达式提取所有的图片地址
var reg=/<img src="(.+?)" alt=".*?"\/>/img;
//exec正则表达式方法,获取匹配到的结果,只能获取一个,指针自动向下移动
var arr =[];
var result="";
while(result= reg.exec(data)){
arr.push(result[1]);
}
for(var i in arr){
(function(i){
setTimeout(function(){
getImg(arr[i]);
},3000*i);
})(i);
}
});
});
//定义一个函数用于获取图片内容
function getImg(ur1){
//console.log('修改前: ' ,ur1);
ur1=ur1.replace(/img\d\d/,'pic152').replace('1.jpg','2.jpg');
//console.log('修改后:',url);
http.get(ur1, function(res){
var fn=new Date().getTime();
//创建一个可写流
var stream=fs.createwriteStream('./files/'+fn+'.jpg');
res.pipe(stream);
});
}
小结
回调函数
什么是回调函数?
回调函数也称为回调(callback),其实就是一个普通函数。将该函数作为另外一个函数的参数传入,由另外一个函数根据条件或时机决定调用
回调函数的实现机制
定义一个普通函数(作为回调函数)
将该函数作为一个参数传入另外一个函数(调用者)中
调用者函数在具体的时机或条件达到时,调用该函数(回过头再调用的函数)
回调函数的作用
如果我们需要在某一个任务完成后,执行一段代码,可以使用回调函数
异步与同步[重点]
什么是异步与同步?
同步:前一个任务完成以后,后一个任务才能继续执行(会造成阻塞)
异步:将比较复杂的任务制作成异步模式(回调函数),后一句代码不需要等待前一.句完成也可以继续执行(不会造成阻塞)
异步的实现
- 回调函数 异步一定有回调函数,回调函数不一定是异步(一些同步的情况也会用到回调函数)
- 事件 触发事件以后执行一个回调函数,就是异步 事件源.on(事件类型,回调函数) ;
- promise promise (承诺)对象,实现异步的消息传递。
buffer缓存区
什么是缓存区?
缓存区就是在内存中开辟存储空间,用于存储字节码数据。
缓存区操作
1.创建新的缓存区
var buf=new Buffer(10);
var buf=new Buffer([97,98]);
var buf=new Buffer('张三 ');
1.读取缓存区
buf.toString(); //将字节码转换成字符串
1.写缓存区
buf.write("字符串");
1.复制缓存区
buf1. copy(buf2);
文件基本操作(直接操作)
读取文件内容
//异步出错时自己定义抛出异常系统不会报错
fs. readFile('文件路径',function(err, data){
//err是错误对象,如果有错则有值,没有错则为nu1l
//data是数据(字符串)
});
//同步:只要在异步的方法名后面加Sync就是同步版本
//出错时系统会自动报错
var data=fs.readFileSync( '文件路径);
读取文件信息
fs.stat('文件路径',function(err, info){
//info就是文件的信息
.size文件的大小
.ctime文件的创建时间
.mtime文件的修改时间
.atime文件的访问时间
.birthtime文件的创建时间
//方法
.isFile()判断是不是 一个文件
.isDirectory()判断是不是一一个目录
写文件内容(新增、修改)
fs .writeFile('文件路径',数据内容,function(err){
//如果文件存在则修改
//如果文件不存在则新增
});
删除文件
fs.unlink('文件路径',function(err){
});
新增目录
fs.mkdir('目录路径',function(err,list){
//list是读取到的当前文件夹的所有文件及其子文件夹列表
});
读取目录中的文件列表
fs. readdir('目录路径', function(){
});
删除空文件夹
fs . rmdir('目录路径', function(err){
//只能删除空文件夹,不能删除非空文件夹
});
其它操作
改支件名或目录名...
流式读写
什么是流
流是一组有序的、有起点和终点的字节数据的传输方式(流式)。流的内容称为字节流。
读取流
var stream=fs.createReadStream('文件路径');
//绑定data事件接收数据
stream. on('data',function(data){
console.1og(data);
});
//绑定error错误事件 异步的方式
stream.on('error'function(err){
throw err;
});
//绑定end结束事件
stream.on('end',function(){
console.log( '数据读取完毕');
});
写入流
var stream=fs.createWriteStream('文件路径');
//写入数据
stream.write('数据1');
stream.write('数据2');
stream.write('数据3');
stream.end(); //流式写入完毕时一 定要-个明确的结束标识
//绑定finish数据写入完成事件
stream. on('finish',function(){
});
//绑定error出错事件
stream. on('error',function(err){
});
管道pipe
什么是管道
管道(pipe)是一种输入流与输出流之间传输数据的机制
管道的写法
输出流.pipe(输入流);
管道的作用
管道可以实现对大文件的操作(文件大小超过内存)
链式流
将多个管道连接起来,进行链式操作。
输出流.pipe(中转流). pipe(中转流).pipe(....). pipe(输出渝) ;
远程服务器(使用的是阿里云)
使用window的远程桌面命令:mstsc: 连接远程服务器,操作服务器。
注意在网页的后面添加robots.txt
就可以看到网站(例如:淘宝)的蜘蛛协议,它可以说明此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。
node.js服务器创建步骤
- 引入通信模块
- 创建服务器
- 监听request事件
- 监听端口
访问服务器:
- 打开浏览器
输入网址
127.0.0.1 本机地址
localhost 本地主机,本地域名
172.16.3.224 局域网工IP(使用cmd命令行获取ipconfig)
例:
var http=require('http');
//创建服务器
var server=http.createServer();
//监听request请求事件, 当前请求事件发生时就返回数据
server.on('request',function(req,res){
//都是以流的方式来传送请求
//req: 请求对象,包含了所有客户端请求的数据,请求头、请求主体
//res:响应对象,包含了所有服务器端发送给客户端的数据,响应头、响应主体
res .write('<h1>He11o Node.js</h1>');
res .write('<p>He1lo 1111</p>');
res. end();
});
//监听服务器的80端口(默认的就是80,所以访问时不需要加端口号)
//可以监听其他端口,但是访问时需要加端口号
server.listen(80, function(){
console.log( '服务器已运行...');
});
//组合写法
require('http').createServer(function(req,res){
res .write('<h1>He1lo world</h1>');
res.end() ;
}).listen(80,function(){
console.log( '服务器已运行...');
});
注意:可能需要的cmd命令
//查看自己的电脑开了哪些端口
//netstat -a
//查看端口被谁占用
//netstat -ab
服务器url
网页响应内容:
可以根据用户请求的url不同,判断响应不同的数据,实现访问不同的URL得到不同的结果。 核心: req.ur1获取到用户请求的网址
例
var http=require('http');
var server=http.createServer();
server.on('request',function(req,res){
if(req.url==='/'){
res.write("<h1>HomePage</h1>")
}
if(req.url==='/article.html'){
res.write("<h1>article.html</h1>")
}
if(req.url==='/about.html'){
res.write("<h1>about.html</h1>")
}
res.end();
});
server.listen(80, function(){
console.log( '服务器已运行...');
});
http状态码
什么是状态码
http协议规定的服务器响应数据时的状态编码,就是状态码
常用的状态码
1xx :表示普通消息,没有特殊含义
2xx :表示服务器响应成功
200 成功
3xx :表示重定向
301 永久重定向
302 临时重定向
304 使用缓存(服务器没有更新过)
4xx :无法访问
403 权限不足, 无法访问
404 资源找不到
5xx :服务器有错
500 服务器端代码有错
502 网关错误
503 服务器已崩溃
状态码的使用
res .writeHead(状态码,响应头对象);
例
var http=require('http');
var server=http.createServer();
server.on('request',function(req,res){
res.writeHead(200,{"Content-type":"text/html;charset=utf-8"});
res.write("<h1>中文乱码解决</h1>")
res.end();
});
server.listen(80, function(){
console.log( '服务器已运行...');
});
响应头
Content-Type
响应的文件类型
text/html
注意:未指定响应文件类型时,默认就是html,编码默认是系统编码
Content-Length 响应内容的长度
Access -Control-Allow-Origin 设置响应头可以跨域
例
var http=require('http');
var server=http.createServer();
server.on('request',function(req,res){
res.writeHead(200,{
"Content-type":"text/html;charset=utf-8",
"Content-Length":24
//"Access-Control-Allow-Origin":"*"//实现跨域
});
res.write("<h1>中文乱码解决</h1>")
res.end();
});
server.listen(80, function(){
console.log( '服务器已运行...');
});
MIME类型:
什么是MIME类型
MIME类型可以认为是文件类型的表述
常用的MIME类型
.txt text/plain
.html text/html
. CSS text/css
.js text/javascript
.png image/png
.jpg image/jpeg
.gif image/gif
.json text/json application/json
.mp3 dio/mpeg
.mp4 video/mpeg
.pdf application/pdf
.xml text/xm1
.zip application/x-gzip
例
"Content-Type:"text/html; charset=utf-8", / /生成一个html网页
"Content-Type":"text/plain; charset=utf-8", //生成一个普通文本
"Content-Type":"inage/png", //生成一个普通文本
"Content- Type":"application/x-gzip", //生成一个压缩包, 浏览器自动下载
静态网页资源服务器实例
客户端向服务器传递数据:
GET方式
- 在URL后面添加?写键值对形式就是GET方式传数据 只要可以写url的地方就可以在后面加?传参数 在node.js可以接收到客户端传过来的参数值。
POST方式
- post方式提交数据只能使用表单提交的方式
实例
接收Get方式传值
方式一
var http=require('http');
var server=http.createServer();
server.on('request',function(req,res){
//Get方式
//通过解析req.url后面参数字符串的解析分析出传递的参数的值
var query = req.url.split("?");
var value = query[1].split("=");
res.writeHead(200,{"content-type":"text/html;charset=utf-8"});
res.write("<h1>你传递的参数的值是"+value[1]+"</h1>")
res.end();
});
server.listen(80, function(){
console.log( '服务器已运行...');
});
方式二
var http = require("http");
var http = require("url");
var serve = http.createServe(function(req,res){
//传参lohost://9999?a=b&c=d
var params = url.parse(req.url,true).query;
//类型转换为字符串
res.write(params.a+" ");
res.write(params.c+" ");
res.write("<p>hello World</p>");
res.end("end...");
});
serve.listen(9999,function(){
console.log("serve is runing...");
});
接收Post方式传值
var http=require('http');
var server=http.createServer();
server.on('request',function(req,res){
//判断请求
if(req. ur1==='/action.html'){
//从req请求主体中获取到POST方式提交的数据
var query='';//存储结果
//post请求会触发data事件
req.on('data',function(a){
query+=a.toString();
});
//请求结束会触发end事件
req.on('end',function(){
res.writeHead(200, {"Content - Type": "text/html; charset=utf-8"});
res.write('<h1>我们已经收到了请求</h1>');
res.write(' <h1>接收到的数据是:'+query+*</h1>' );
res.end( );
});
return;
}
server.listen(80, function(){
console.log( '服务器已运行...');
});
模板
使用动态网页模板:
什么是模板
将一些固定的结构或表现直接以静态文件形式存储,将需要表现成动态数据的地方使用模板语法进行编写,再使用模板引擎读取该静态文件,将动态的数据进行替换进去。最终实现产生出一个动态的网页
小结
path模块
path模块主要用于对路径进行处理(解析、拼接、格式化等)
path.join(字符串,字符串2); //将字符串拼 接成一个完整的路径
path.parse(路径); //将路径解析成为各个不同的部分,返回一个对象
url模块
什么是URL
url是全球统一资源定位符,也称为网址
URL的格式
完整的格式
协议://用户名:密码@主机名.名.域:端口号/路径/文件名.扩展名?参数名=参数值&参数名2=参数值2#hash地址
常见的格式
协议://主机名.名.域:端口号/路径/文件名。扩展名?参数名=参数值#hash地址
url模块
在node.js中提供了url模块,用于解析ur1中的各个部分,有两套API功能:
//传统的node. js的ur1解析
var obj=url.parse(网址);
//按WHATWG标准进行解析
var obj=new url . URL (网址);
http协议
什么是http协议
http协议就是超文本传输协议,主要用于规定客户端与服务器端进行数据传输的过程及格式。
http协议以请求、应答形式进行数据交互,必须一次请求对应一次应答(响应)。
http协议的细节
规定了客户端如何向服务器发送数据
规定了服务器如何向客户端发送数据
发送过程
客户端向服务器端发送数据称为请求,包含请求头和请求主体;
服务器端向客户端发送数据称为响应,包含响应头和响应主体;
http模块
什么是http模块
http模块是node. js中的系统模块,用于进行网络通信(服务器、客户端)
.get()方法
用于获取其它服务器的数据(可以跨域)
语法:
http. get(url, function(响应对象){
响应对象.on('data',function(){
});
});
http协议及工作原理
在浏览器中输入网址,回车时,将网址发送到指定的DNS服务器去查询对应的IP地址。
浏览器获取到IP地址以后,向该IP的服务器发起请求,服务器收到请求,并且读取请求的网页文件,发送给客户端浏览器,浏览器可以直接解析执行html代码将内容渲染出来显示给用户
如果服务器硬盘中没有该文件,就执行动态程序生成一个(使用node.js引擎读写数据库)生成html网页在发送给浏览器。
编写网络蜘蛛抓职itsource . cn首页的所有图片
var http=require('http');
var fs=require('fs');
//获取itsource. cn首页的html内容
http. get( 'http://www.itsource.cn/',function(res){
varstr='';
res. on('data',function(a){
str+=a;
});
res.on('end',function(){
//fs.writeFileSync('./itsource.html',str);
var reg = /url\((\/upload.*?)\)/;
var arr,result=[];
while(arr=reg.exec(str)){
result.push(arr[1]);
}
});
});