目录
1.命令提示符 cmd.exe 这个软件中输入window的指令:node index.js
意思是:node 就是去环境变量中找到这个node变量指向软件node.exe,然后用node.exe 这个软件去运行index.js
如何写一个简单的http服务器
- //引入node自带的模块 http 这个模块可以调用函数,来创建后端服务器
- var http = require('http');
- //创建一个服务器对象,回调函数不会直接运行,会在用户每次访问当前计算机的ip下的8081端口时才可
- var app = http.createServer((req,res)=>{
- //配置返回给用户(前端)的数据包 的数据格式 和编码的类型 utf8
- res.setHeader('content-Type','text/html;charset=utf8')
- //给前端最后一次发生数据包
- res.end('你好啊,66666');
- })
- app.listen(8081); //监听端口8081 每个程序都有一个端口号
然后在当前js文件目录里面,调出cmd,然后输入

当用户访问服务器app的8081端口,回调函数就会返回一个
浣犲ソ鍟�,66666 这明显是一个乱码,乱码是因为传输的有中文
那为什么有中文就会出现乱码呢?
因为前端请求服务器,然后后端就会返回一个数据包,然后前端对其进行解码,没有设置 字符集,所以解码出来的是乱码。
解决乱码:
res.setHeader('content-Type','text/html;charset=utf8')
在头部设置一下:text/css就是css文本格式编码,text/html就是html文本格式编码,charset=utf8 就是遵从utf8字符集进行解码。
req (require:请求):前端发送过来的数据包 其中信息包括:浏览器本地的缓存,在浏览器输入的网址 等。
这个数据包传到后端后就放到 req 中 ,req是一个对象(很大),其中 req.url属性就是 在浏览器输入的网址
res(result):后端发送回去的数据包
所以:只有ip地址和端口写对了,就一定会运行:
- var app = http.createServer((req,res)=>{
- //配置返回给用户(前端)的数据包 的数据格式 和编码的类型 utf8
- res.setHeader('context-Type','text/html;charset=utf8')
- //给前端最后一次发生数据包
- res.end('你好啊,66666');
- })
所以,根据浏览器输入网址端口后面部分的不同,后端返回给前端的数据也就不同

- var http = require('http');
- var app = http.createServer((req,res)=>{
- res.setHeader('content-Type','text/html;charset=utf8');
- if(req.url == '/car'){
- res.end('666');
- }else if(req.url == '/home'){
- res.end('你好啊,欢迎回家');
- }else{
- res.end('not 404');
- }
- });
- app.listen(8081);
如果不写返回 res.end();就会:

分析:前端与后端的通道,前端发生给后端数据包后,后端没把处理的数据包返回给前端,所以前端就会等待(一直转圈圈)。
如果过一段时间后端还是没有 res.end() 返回。那么浏览器就会自动判断,不会返回了,就会出现下面的页面:

问题:下面代码中,为什么浏览器输入:192.168.6.141:8081/home 会得到
- var http = require('http');
- var app = http.createServer((req,res)=>{
- console.log(req.url);
- if(req.url == '/home'){
- res.end('666666666');
- }else{
- res.end('not found');
- }
- });
- app.listen(8081);
结果:

分析:打印出2个 req.url 说明 回调函数执行了两次,第一次打印出 /home这个不难理解,就是用户输入的网址中的 /home ,那么/favicon.ico又是怎么回事呢? 是因为浏览器会自发的请求这个小图标

但是后端返回的是'not found' 这个字符串,浏览器不会把字符串拿去做小图标,所以就会用浏览器自带的小图标。 浏览器自带的小图标 就是 /favicon.ico
引入系统自带的模块 fs file system
var fs = require('fs');
读取文件 fs.readFile();
- fs.readFile('./pic1.png',(err,data)=>{
-
- });
分析:这个函数两个值,一个是文件路径, 一个是回调函数,不管文件读取是否成功,回调函数都会成立,读取成功,data有值,读取失败,err有值
- var http = require('http');
- var fs = require('fs');
- var app = http.createServer((req,res)=>{
- if(req.url == '/666'){
- fs.readFile('./pic1.png',(err,data)=>{
- if(!err){ //读取成功err就没有值, !err 有值 执行if里面代码
- res.end(data);
- }
- })
- }
- });
- app.listen(8081);
浏览器输入网址: 192.168.6.80:8081/666 就能读取出图片。
案例:访问以前写的html+css静态网页
- var http = require('http');
- var fs = require('fs');
- var app = http.createServer((req,res)=>{
- //前端的每一次网络请求,这个函数都会重新运行一次
- if(req.url == '/home'){
- fs.readFile('./index.html',(err,data)=>{
- res.setHeader('content-Type','text/html;charset=utf8');
- res.end(data);
- })
- }else if(req.url == '/123'){
- res.setHeader('content-Type','text/html;charset=utf8');
- res.end('123');
- }else if(req.url == '/pic.png'){
- //返回 图片文件 不同的文件,类型不一样
- res.setHeader('content-Type','image/png');
- res.readFile('./pic1.png',(err,data)=>{
- res.end(data);
- });
- }
- else{
- res.end('404');
- }
- });
- app.listen(8081);
分析:3个网页,一个是返回 一个html网页,一个返回 123 ,一个返回 图片
根据浏览器输入的网址不同,结果不同。
浏览器加载图片,并不是浏览器网址一输入进去,图片就显示在网页上,而是浏览器遇到img标签的src属性,然后去到src属性地址中把图片加载过来。