一、Node.js开发应用程序和php等传统模式开发web应用程序区别

传统:

nodejs ioredis 断开连接_数据


nodejsWeb

nodejs ioredis 断开连接_服务器_02

REPL介绍------Read-Eval-Print-Loop(交互解释器)

R - 读取用户输入,解析输入javascript 数据结构并存储在内存中
E - 执行输入的数据结构
P - 打印-输出结果
L - 循环操作以上步骤直到用户两次按下ctr-c按钮退出
类似于控制台这种循环命令执行

二、在repl中编写程序(类似于开发人员工具中的控制台)

直接在控制台输入node命令进入 REPL环境 按住ctr+c两次推出REPL界面,或者.exit 退出REPL界面+ 按住control键不要放开,然后按两下c键

三、创建javascript文件编写程序

  • 不要用中文
  • 不要包含空格
  • 不要出现node关键字
  • 建议以’-'分割单词

    在终端运行服务器 node 文件路径

    若不是当前盘符需要完整的文件路径

四、nodejs(内置对象)模块学习

  • 不是全局模块需要用require引入
var path=require('path');
var fs=require('fs');
var http=require('http');
  • 是全局模块的直接用就可以process,console,global模块使用无需用require

全局模块直接使用,非全局需要加载

4.1文件操作
4.1.1文件写入

//执行文件操作

//-----实现文件写入操作--------------
//1、加载文件擦做模块,fs模块
var fs=require('fs');
console.log('111');
//2、实现文件写入操作
var msg='Hello World';
//调用fs.writeFile(路径,要写的数据(string/buffer),回掉函数)进行写入
//fs所有Api都有同步(等待读写完毕,刷新)和异步(后台不刷新)
//第一个参数没有文件自己创建  ./当前目录

fs.writeFile('./hello.txt',msg,'utf-8',(err)=>{
    //err==null,表示写入文件成功,没有错误
    //err里面不是null,表示写入文件失败
    if(err)
    {
        console.log('写文件出错了,具体错:'+err);
    }
    else
    {
        console.log('ok');
    }
    
})
console.log('22');
结果:111  22 ok
  • 单线程+队列执行(先进先出)
  • 异步展示动画网址: http://latentflip.com/loupe
    4.1.2读文件
//1、加载模块
var fs=require('fs');
//读readFile(路径,(err,data)=>{  data 读的数据buffer--回调函数
    
    
//})
fs.readFile('./hello.txt',(err,data)=>{
    
    if(err)
    {
        throw err;
    }
    console.log(data);//<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64>
    //data参数的数据是一个buffer对象,里面保存的是一个一个的字节
    console.log(data.toString('utf-8'));//Hello World  buffer对象转不写默认utf-8
    
});
  • __dirname 和 __filename(本地不用加载但不是全局)

__dirname:表示当前正在执行的js文件的目录
__filename:表示当前正在执行的js文件的完整路径

console.log(__dirname);//G:\nodejs\nodejs
console.log(__filename);//G:\nodejs\nodejs\1.js//

拼接路径–两个斜杠

nodejs ioredis 断开连接_数据_03

  • path.join();//拼接正规标准路径
  • 创建一个文件夹
fs.mdir('./text-mkdir',(err)=>{
    if(err){
        console.log('创建目录出错,详细如下');
        console.log(err);
    }
    else{
        consloe.log('success');
    }
})
  • 创建
//文件操作案例(初始化目录)
//引进路径/文件类
//加载path fs模块
console.log('111100');
const path=require('path');
const fs=require('fs');

//文件建立路径 斜杠不是一个 是两个斜杠转义字符
let root='H:\\';

//文件初始化文件夹
let initDate={
 projictName:'myDemo',
 //dir(文件夹) file(文件)
 data:[
 {name:'css',type:'dir'},
 {name:'img',type:'dir'},
 {name:'js',type:'dir'},
 {name:'index.html',type:'file'}
	
 ]
};
//使用反引号编写文件内容
let fileContent=`
<!DOCTYPE html>
<html>
 <head>
  <meta charset="utf-8" />
  <title></title>
 </head>
 <body>
  
 </body>
</html>
`;
//创建项目路径mkdir(路径,函数)创建文件 md创建文件
fs.mkdir(path.join(root,initDate.projictName),(err)=>{
	
 if(err)return;//表示路径拼接失败 中介程序
 initDate.data.forEach((item)=>{
  console.log(item);
  if(item.type=='dir')
  {
   fs.mkdirSync(path.join(root,initDate.projictName,item.name));
  }
  if(item.type=='file')
  {
   //创建文件写入内容
   fs.writeFileSync(path.join(root,initDate.projictName,item.name),fileContent);
  }
 })
})

4.1.3http模块构建一个简单的http服务

//创建一个简单的http服务程序

//1.加载http模块
var http=require('http');

//2、创建一个http服务对象
var server=http.createServer();

//3、监听用户的请求事件(request事件请求所有时间)response(响应所有数据)
//requset 对象包含了用户请求报文中的所有内容,通过request对象可以获取所有用户提交过来的数据
//response对象用来向用户相应一些数据,当服务器要向用户响应数据的时候必须用resoponse对象
server.on('request',(req,res)=>{
解决乱码的思路:服务器通过设置http相应报文头,告诉浏览器使用相应的编码来解析网页
res.setHeader('Content-Type','text/html');
//没响应一直等等
res.wirte('hello');
//对于每一个请求,服务器必须结束相应,否则客户端(浏览器)会一直等待服务器响应结束
res.end();
});

//4、启动服务
server.listen(8080,()=>{
    console.log('服务器启动,请访问:http://localhost:8080'); 
})

4.1.4浏览器访问呢服务器过程

1、 首先在浏览器输入网址eg:http://www.taobao.com(域名DNS类似名字)

2、 浏览器通过用户在地址栏中输入的URL封装为HTTP请求报文:把地址封装成请求报文

nodejs ioredis 断开连接_客户端_04


3、 浏览器发起DNS解析请求,将域名转换为IP地址

nodejs ioredis 断开连接_服务器_05

4、浏览器将请求报文发送给服务器
5、服务器接收请求报文、并解析
6、服务器处理用户请求,并将吹结果封装为HTTP响应报文

nodejs ioredis 断开连接_服务器_06


nodejs ioredis 断开连接_客户端_07


7、服务器将HTTP响应报文发送浏览器

8、浏览器接受服务器响应的HTTP报文,并解析。

9、浏览器解析html页面并展示,在解析HTML页面时遇到的新的资源需要再次发起请求

10、最终浏览器展示出来页面

4.1.5HTTP请求报文和响应报文格式

nodejs ioredis 断开连接_客户端_08

4.1.6DNS解析

nodejs ioredis 断开连接_nodejs ioredis 断开连接_09

五、Web开发本质

1、请求,客户端发起请求
2、处理,服务器处理请求
3、响应,服务器将处理结果发送给客户端

5.1
客户端处理响应

  • 服务器响应完毕后,客户端继续处理
    浏览器:解析服务器返回的数据
    ios\android客户端,解析服务器返回的数据,并且通过ios或Android的ui技术实现界面的展示功能
    关于C/S(Client/Server)和 B/S(Browser/Server)
  • C/S:客户端服务器(cs架构:qq有独立客户端的):有独立客户端
  • B/S:浏览器服务器():没有独立客户端通过浏览器访问

如果说到应用什么语言去开发C/S 或者说是B/S 结构的的程序,那么作为目前的一个现状来说,很可能就认为:C++,C#,VB等更偏向C/S开发,而所用到的像JS,java,JQuery等,则会被认为更偏向于B/S开发。(某一时期,我是这么认为的)但是,这是不准确的!为什么,看后续的C/S和B/S的关系就明白了。

nodejs ioredis 断开连接_数据_10


售票员CS系统:用专门单独客户端

  • B/S:
    范围:零安装:拥有一个浏览器,即可访问。因此,它所面向的范围更为的广阔。

扩展性:通常来说,通过增添网页即可扩展系统的功用。零维护:更新页面,即可以实现面向所有用户的更新。

共享:B/S 通过浏览器访问,共享性强。

  • C/S:
    安全性:C/S需要其特定的客户端,所以面向的对象比较确定,由此所进行的信息安全处于一种可控的范围。

效率:客户端和服务端直接相连,省却了中间环节,数据的传输相对较快。

个性化:C/S尤其特定的客户端,因此可以较大程度上满足客户的个性化要求,如界面、操作等。

稳定性:结构较稳定,较强的事务处理能力,可实现比较复杂的的业务逻辑。

缺点
C/S

由于需要在PC端安装特定的软件,所以,它对PC机有一定的要求:如,操作系统。而且,安装和部署复杂。

扩展性和维护成本高,当面对第二客户有不同需求时,得修改其界面等设计。当客户端达到一定的量时,同时访问服务器,造成服务端的响应变慢,效率变低。(但在数据量小的时候不存在)

B/S

由于B/S针对的对象范围广,所以,它的设计一般而言是一种公共审美,无法满足个性化的需求。