1. nodejs 服务器搭建

nodejs 写一个服务器,别人能够访问到;

http 协议:浏览器 和 服务器 遵守的规范;

http 服务器 和 浏览器 之间的通信,都是通过 http 实现的

我们的服务器,最重要的一环,监听,也就是说,http 向服务器发送请求,那么服务器就应该接收到这样的请求,这就是监听;

第一步: 我们创建server.js文件如下:

// 1. 导入http模块
const http = require("http");

// 2. 创建一个web服务器对象
const server = http.createServer();

// 3. 监听请求事件
server.on("request", (req, res) => {
    //req-->request 请求对象, res-->response 响应对象
	// 通过响应头设置返回前台数据格式及编码。(解决中文乱码的问题)
    res.setHeader('Content-Type', 'text/html;charset=utf-8');
    //res.write()表示向客户端输出的方法
    res.write("hello world,你好nodejs")
    //res.end()每次响应完,需要调用此方法 来结束响束
    res.end();
})

// 4. 监听端口,为了避免端口冲突,这里给一个本机端口3000
server.listen(3000, () => {
    console.log("服务器启动成功");
})

第二步:启动服务器
以上就是初步创建的服务器文件,接下来让我们在server.js所在的目录下打开dos终端窗口,执行如下指令:

node server.js

第三步:访问服务器
打开任意浏览器,地址栏中输入 http://127.0.0.1:3000或者http://localhost:3000 便可访问服务器。

2. 服务器业务函数参数分析:

req:

req参数指得是request 请求对象,凡是浏览器发送请求相关的信息,都可以从该对象中找到。例如:

  1. req.url 用户请求的路径
  2. req.headers请求头
{
//请求报头域主要用于指定被请求资源的Internet主机和端口号
 host: 'localhost:3000',
//Connection: keep-alive  当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接
//例如: Connection: close  代表一个Request完成后,客户端和服务器之间用于传输HTTP数据的TCP连接会关闭, 当客户端再次发送Request,需要重新建立TCP连接。
 connection: 'keep-alive',
// 这个是非常重要的规则。 这个用来指定Response-Request遵循的缓存机制。各个指令含义如下
//Cache-Control:Public   可以被任何缓存所缓存()
//Cache-Control:Private     内容只缓存到私有缓存中
//Cache-Control:no-cache  所有内容都不会被缓存
 'cache-control': 'max-age=0',
 'upgrade-insecure-requests': '1',
 //告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本
 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
 // 浏览器端可以接受的媒体类型,通配符 * 代表任意类型例如  Accept: */*  代表浏览器可以处理所有类型,(一般浏览器发给服务器都是发这个)
 accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
 //浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate),(注意:这不是只字符编码);
 'accept-encoding': 'gzip, deflate, br',
 //浏览器申明自己接收的语言
 'accept-language': 'zh-CN,zh;q=0.9'
}
  1. req.method:请求类型 如:get 、post 等
  2. req.httpVersion:http协议版本 ,目前我们使用的是HTTP/1.1 版本
res

res是相应对象,凡是服务器想要给前端浏览器的数据和信息。都需要res去完成。

  1. res.setHeader() //设置响应头 ,例如 res.setHeader(‘Content-Type’, ‘text/html;charset=utf-8’);
  2. res.wtire() // 向浏览器输出
  3. res.end() // 向浏览器 响应结束
  4. res.statusCode // 设置响应状态码
  5. res.statusMessage //设置响应 状态信息
  6. res.writeHead() // 综合写法: 状态码,信息,响应头,如下
res.writeHead(404, 'Not Found', {
 	        'Content-Type': 'text/plain;charset=utf8'
 	 })

3. 服务器的扩展

//加载http模块
 		var http=require('http');
 		
 		// 加载fs模块   文件的读取,写入。。。
 		var fs=require('fs')
 		
 		//创建服务器对象
 		
 		//每当有人 访问了app,function就会执行一次。
 		
 		var app=http.createServer(function(req,res){
 		    //req 请求对象
 		    //req.url  表示用户的请求路径。 
 		    // 请求路径1:  127.0.0.1:3000/  我们自己发送的
 		    // 请求路径2:  127.0.0.1:3000/favicon.ico   浏览器的请求。(请求图标)
 		     if(req.url=='/'){
 		        fs.readFile('./index.html',function(err,data){
 		            //data -buffer类型数据 (底层二进制数据)
 		           if(!err){
 		               //  console.log(data.toString());
 		                res.write(data);
 		                res.end();
 		           }
 		        });
 		     }else if(req.url=='/favicon.ico'){
 		         fs.readFile('./logo.png',function(err,data){
 		             if(!err){
 		                 res.write(data);
 		                 res.end();
 		             }
 		         })
 		     }
 		})
 		//监听端口
 		// 参数一:指定服务器运行的端口号 , 端口号有取值范围 0-65535, 0-1024系统保留端口
 		// 参数二:指定服务器运行的域名(ip)。本地域名:localhost, 本地ip 127.0.0.1
 		// 参数三:回调函数。 当node server
 		app.listen(3000,'127.0.0.1',function(err){
 		       //err 错误对象, 默认值:null,
 		        // 只有app.listen 出现错误, err={err:'xxxx'}
 		       if(err){
 		            throw err;
 		       }else{
 		           console.log('服务器运行在127.0.0.1:3000上')
 		       }
 		})

静态资源服务器

1. 首先目录要安装如下结构创建
         js
         img
         css
         server.js
         index.html
    2. server.js代码如下:
//定义服务器的文件

   	var http=require('http');
   	
   	var fs=require('fs');
   	
   	var app=http.createServer(function(req,res){
   	    console.log(req.url)
   	      if(req.url=='/'){
   	          fs.readFile('./index.html',function(err,data){
   	              if(!err){
   	                  res.end(data);
   	              }
   	          })
   	      }else if(req.url=='/favicon.ico'){
   	          fs.readFile('./img/logo.png',function(err,data){
   	              if(!err){
   	                  res.end(data);
   	              }
   	          })
   	      }else{  //  req.url==  /css/a.css, /img/3zhe.jpg, /img/4zhe.jpng
   	          fs.readFile('.'+req.url,function(err,data){
   	              if(!err){
   	                  res.end(data);
   	              }
   	          })
   	      }
   	
   	})
   	
   	app.listen(4000,'localhost',function(err){
   	    if(!err){
   	        console.log('您的服务器成功运行在localhost:4000上')
   	    }
   	})


/*
1. 用户访问  localhost:4000/ -----> 返回 index.html

2. 浏览器自动访问  localhost:4000/favicon.ico  ----->  返回  ./img/logo.png

3. 页面中会引入 css,  localhost:4000/css/a.css  ----->  返回 ./css/a.css

4. 我们页面,不只要引入一个css,或一个js,或一个img,
  我们要引入的事多个 css,js,img,总不能一个一个去判断,req.url 然后做出响应。

  -------》  封装一个 能返回静态资源的通用服务器。

  1. 归类所有请求可以分为 几类。  / ,  /favicon.ico  /css/a.css /img/3zhe.jpg /js/a.js

  3. 初步分析,可以分为3类 :   第一类: / 
                      
                             第二类: /favicon.ico 

                             第三类: /css/...,  /js/...  ,  /img/...


*/