zhuhuiwen Front-end Dev Engineer

nodejs-day03

2017-01-14

网络编程

什么是web服务器

  • web服务器是一种应用服务器

2.3node 没有web容器

  • 就是web服务器的意思

3.4ip&端口号

  • ip
    • 唯一标识一台上网的设备
  • 端口
    • 唯一标识设备上的一个应用程序
  • 地址
    • localhost:3000 不走网卡
    • 127.0.0.1:3000 走网卡
    • 192.168.141.xxx 通过网卡发送请求给路由或交换机,在请求回来你的电脑
  • 怎么通过域名找到你的电脑

  • get没有请求体,post有请求体???
    • 由于get方式是不包含实体内容的,实体内容就(也就是表单的数据)以参数的形式在url地址后面出现
    • post是包含实体内容的,它把表单数据放入实体内容里面,以’实体内容’的形式传输

2.6 http协议

  • 概念

http模块

使用http模块进行web开发

  • 01-server.js
    • 引入http模块
    • 创建一个http服务器的实例
    • 要让服务器接收http请求
    • 回调函数里面有两个参数
    • request对象的作用
      • 存储浏览器发送过来的http请求的内容
    • response对象
      • 封装一个返回的报文
      • 一旦执行额end方法,响应报文就返回了,整个http请求到相应的流程就结束了
    • server.listen(3000)设置端口号
      • node默认用3000端口号
    • 192.168.24.103
    • chrome中,更多工具–>编码–>设置成utf-8
    • 代码 ```

- 设置
	- 请求
		- 请求头、方法、路径、请求http协议版本

### response ###

- 方法
	- res.write('')
		- write 一直向报文体里写,也就会传给浏览器
	- res.end(参数)
		- end执行了表示报文已经返回了
		- 参数
			- 可以写,就是先自己有write一下+end()
			- 不写,就是直接进行end()
- response.writeHead(200,{'Content-Type':'text/html;charset=utf-8'})
	- 'Content-Type':'text/html;' 解析成html格式的
	- 告诉浏览器,你用html格式去解析
- 在index.html中的script
	- 图片  脚本 css 等都发送http请求
		- 去执行了127.0.1:3000/main.js
- 发送请求
	- 发送html,就只
	- 验证 req.url

- 页面中的资源,会发送http请求去请求一遍
- 请求路径有同源路径
	- 不写前面的根路径,自己会默认的去找

- 上面的都是http的get请求
- http模块是核心模块
1/14/2017 11:40:10 AM 

- 补充
	- res.end()之后的代码
		- end方法后面不可以在对响应报文做出操作,
		- 但是可以继续执行后面的跟操作报文无关的代码
	- res.writeHead()必须放在write
		- 如果需要设置响应头,需要优先于响应体设置
		- 如果已经设置了响应体以后,不能再设置响应头
			- 因为已经发送给用户了
		- 先 响应头再响应体的 (根据http的请求报文为依据)
		
## ajax ##

###  ###

1. 05.ajax

### post ###

- post在后台接数据 
	- 通过request对象的data事件,可以一块一块的获取到浏览器发送http报文的报文体
		- 之前的是设置请求头,将请求头给request的了,我们不需要关系
	- data事件什么时候触发
		- 每发送一小块数据data事件就会触发
	- req.on('end',function(){数据接收完成触发的事件})


### node.js之Url & QueryString模块 ###
#### URL模块 ####
- 将字符串转换成对象
	- 参考文档
		- http://www.jianshu.com/p/aed6a885db61
- 代码


var url = require("url");
var qs = require("querystring");
var urlStr = "http://127.0.0.1:3000/getData?name=waxun&age=11";
// console.log(url.parse(urlStr));
//将字符串转换成对象
console.log(url.parse(urlStr).pathname);
console.log(url.parse(urlStr).query);//name=waxun&age=11
console.log(qs.parse(url.parse(urlStr).query));

#### queryString 模块 ####

- 查询字符串主要由两个方法和内置格式化方法组成,
	- 一个是将对象转换为字符串,
	- 一个则是相反,将字符串转换为对象
- querystring.stringify(obj, [sep], [eq])
	- 将对象转换成json字符串
	- 将JSON对象格式化为查询字符串格式的字符串,默认的分隔符为:“&”和“=”
- querystring.parse(str, [sep], [eq], [options]):
	- 将json字符串转换json对象
	- 根据“&”和“=”将字符串进行分割,反序列化为JSON对象

- 代码

	//将对象转换成json字符串
	//querystring.stringify(obj, [sep], [eq]);
	
	/*var qs = require("querystring");
	var obj = {
	    "name" : "waxun",
	    "age" : 11
	};
	// qs.stringify(obj);
	console.log(qs.stringify(obj));//name=waxun&age=11
	console.log(typeof qs.stringify(obj));//string*/
	
	//将json字符串转换json对象
	var qs = require("querystring");
	var str = "name=waxun&age=11";
	console.log(qs.parse(str));//{ "name" : "waxun","age" : 11}
	console.log(qs.parse(str).name);//waxun
	console.log(typeof qs.parse(str));
# 2. 同步与异步 #

### 2.1 什么是i/o? ###

i/O 在服务器上可以理解为读写操作


### 2.2 什么是并发 ###

- 一个时间段中有几个程序都处于已情动运行到运行完毕之间

# 3.异步i/o与实践驱动 #

### 3.1什么是进程 ###

- 进程是为运行当中的应用程序提供运行环境的
- 一个运行当中的应用程序就会有一个进程与之相对应
- 进行执行应用程序
### 线程 ###

- 线程是用来运行应用程序中代码的
- 一个线程在一个时间只能做一件事件
- 多线程,调用起来很麻烦
- node是单线程执行,用异步替代了多线程
- 多线程的有调度关系

### 3.3同步、异步有什么不同 ###

- 同步是按顺序执行、会阻塞后面代码的执行
- 异步时不需要等前面的代码再慢,也不会阻塞后面代码的执行
	- 异步总是有callback就是这个原因

### 同步异步例子 ###

- 同步代码阻塞后面代码的执行
- 异步代码
	- 写一个setTimeout(function(){},1)
- 先执行的永远是同步代码
- 异步代码
	- 是不一定的顺序
- 异步函数谁先调用callback函数是不一定的


### 问题 ###

- 没设置成dataType类型

	- 数据在传输的过程中是json字符串的形式,
	- 那为什么有的可以进行返回json对象的形式?
	- 这个是怎么过来的数据

-  res.writeHead(200,{"Content-Type":"text/json;charset=utf-8"});
1/14/2017 10:09:27 PM 


- 前台进行发送ajax请求,后台进行接收数据进行返回数据
	- 代码

	ajax.js
		var http = require("http");
	var fs = require("fs");
	var server = http.createServer();
	server.on("request", function (req, res) {
	    if (req.url == "/" && req.method == "GET") {
	        fs.readFile("./index.html", function (err, data) {
	            if (err) {
	                console.log(err);
	            }
	            res.write(data);
	            res.end();
	        })
	    } else if (req.url == "/jquery.min.js" && req.method == "GET") {
	        fs.readFile("./jquery.min.js", function (err, data) {
	            if (err) {
	                console.log(err);
	            }
	            res.write(data);
	            res.end();
	        })
	    } else if (req.url == "/getData" && req.method == "POST") {
	        //GET请求
	        /*var dataJson = {
	            "name" : 123,
	            "age" : 18
	        };
	        res.end(JSON.stringify(dataJson));*/
	
	        //POST请求
	        var info = "";
	        //监听数据
	        req.on("data", function (str) {
	            info += str;
	        })
	        //监听数据接收完成事件
	        req.on("end", function () {
	            console.log(info);
	
	            //后端返回一个成功的提示信息,以字符串的形式进行返回
	            var data = { "success": "true" };
	            res.end(JSON.stringify(data));
	        })
	
	    }
	})
	
	server.listen(3000);

- 前台代码

```

http协议&node.js之Url&QueryString模块

反馈

  • 反馈一
    • 要规避本地和原生模块的同名
  • 反馈二
    • myRequire是module的经典案例
  • 上天内容
    • require 和 module 和 module.exports
    • require
      • 参数
        • 字符串
          • 路径、名称(核心模块/包)
        • 可以省略后缀.js .node .json
        • 第一次加载读源文件,第二次加载缓存
        • module.exports
        • 当前node_modules去找,一级一级向上找
    • module
      • 当一个js一执行,就产生了一个module..
      • module.exports是一个空对象
    • exports是module.exports的别名
      • module.exports里面只能加属性,以免覆盖
  • npm命令
    • 命令多练习
  • 全局环境中path里面对应的node_modules是干嘛的?
    • http://www.tuicool.com/articles/RZ3mAn7

Similar Posts

上一篇 nodejs-day02

下一篇 nodejs-day04

Comments