【node.js】知识点总结
2
不会就问就查询!科技利民,学海⽆涯!
js脚本编程入门⼀、概念
Node.js不是语⾔、不是库、不是框架;
Node.js是JavaScript的运⾏环境,可以解析、执⾏JavaScript代码;
使JavaScript可以脱离浏览器来运⾏;
⼆、组成部分
1、浏览器中JavaScript:
ECMAScript
DOM
BOM
2、Node.js中JavaScript:
ECMAScript
没有DOM、BOM
为JavaScript提供了⼀些服务器级别的操作API:
⽂件读写
⽹络服务的构建
⽹络通信
http服务器等。。。
三、特点
事件驱动
⾮阻塞IO模型(异步)
轻量和⾼效
构建于chrome的V8引擎 之上
四、⽤途
web后台服务器
命令⾏⼯具
五、主要知识点
B/S编程模型
模块化编程
Node常⽤API
异步编程
Express开发框架
Ecmascript 6
六、安装使⽤
:稳定版(LTS)、最新体验版(Current);(重复下载会升级覆盖)
命令⾏检查:node --version/node -v;
对应⽬录下执⾏js脚本⽂件:node aa.js
创建JavaScript脚本⽂件,不要使⽤node.js
打开命令⾏⼯具定位到⽂件
执⾏js⽂件
读写⽂件:fs模块(file-system⽂件系统:提供所有⽂件操作API)
引⼊模块:var fs = require('fs')
读⽂件:fs.readFile('⽂件路径',回调函数function(error,data){ if(error){ console.log('友好地提⽰:读取失败') } else{ console.log(data)} }),读取成功:(data:所读数据;error:null)
读取失败:(data:null;error:错误对象(直接展⽰给⽤户不友好))
默认返回⼆进制数据(以⼗六进制显⽰),使⽤toString();
例如:fs.readFile('./',function(error,data){ console.String())})
写⽂件:fs.writeFile('⽂件路径',‘⽂件内容’,回调函数function(error){})
写⼊成功:error:null,
写⼊失败:error:错误对象
删除、创建⽂件等。。。
http服务:http模块
请求、响应都在实例的on⽅法的回调函数中;
请求:主要⽤于告诉服务器,客户端传的是什么路径;req.url
响应:⽤于针对不同路径做对应响应,只能传字符串或⼆进制(读取⽂件时的数据就是⼆进制),所以其他数据需要转成字符串/⼆进制;
⽅式⼀:res.write([响应内容]);d();
⽅式⼆:直接d([响应内容]);
响应内容:必须是字符串(通过编码规则转成⼆进制)或⼆进制,因为在前后端不同语⾔间传输的数据是以JSON字符串形式;
JSON.stringify();转成json字符串(序列化:⽤于传输);
var http =require('http')
var server = ateServer()//返回⼀个实例
<('request',function(request,response){
console.log('当前访问的路径是'+ request.url)
//这⾏代码时展⽰在服务器上的;url是端⼝号后⾯的部分,默认`/`根路径
var url = req.url;
if(url =='/'){
}
else{
response.setHeader('Content-Type','text/plain;charset=utf-8');
//告诉浏览器响应数据类型为普通⽂本,字符编码格式是utf-8;
response.write('hello 其他');
//中⽂会有乱码,要配置响应内容类型
}
/
/响应到客户端页⾯中,end()⽅法表⽰响应结束,否则浏览器⼀直等待。
})
//监听客户端打开⽹址,服务器收到请求时回调
server.listen(3000,function(){
console.log('服务器启动成功了,可以通过 127.0.0.1:3000/ 来进⾏访问!')
})
//当服务启动后回调,80端⼝时客户端不需要输端⼝;
七、Node中的JavaScript
EcmaScript
内置的具名的:var [模块名] = require('[模块名]');
常⽤:fs,http,os,path,
第三⽅模块:Express web开发框架,需要下载引⽤;
⽤户⾃定义模块:就是常说的模块化编程,引⼊js⽂件;
Node中没有全局作⽤域,只有模块作⽤域,即引⼊的不同js⽂件,不能互相访问内部变量;所以要在js⽂件内使⽤exports对象导出内部变量、⽅法;
引⼊时可以不写后缀.js;但必须写相对路径./,../,否则会被认为是核⼼模块,报错!
⼋、服务器端的ip与端⼝号
IP:ip地址⽤来定位计算机;
端⼝号:0~65536,端⼝号⽤于定位具体的应⽤程序;(因为⼀台计算机有多个应⽤程序,靠IP地址⽆法区分通讯)客户端中浏览器等应⽤程序会默认⼀个空闲端⼝来与服务器通信;
⼀些指定端⼝号与指定服务联系,不会被默认使⽤;
80端⼝号,⼀般在上线部署时⽤,浏览器默认加80,⽤户就不⽤写了;
3000端⼝号,⼀般在开发测试时⽤;
所有需要联⽹通信的应⽤程序都会占⽤⼀个端⼝号;
互相通信的计算机都知道彼此IP地址、端⼝号;
所以⼀台服务器可以开启多个服务,每个服务对应⼀个端⼝号。
九、响应内容类型
问题原因:
服务器默认发送的json字符串数据(读取⽂件时⽂件内容编码成的⼆进制所采⽤的规则由⽂件创建时的编码环境决定,⼀般⽤开发⼯具创建的⽂件都是utf-8)就是utf-8编码,但是浏览器默认不知道是什么编码,会按当前操作系统默认的编码格式,如:中⽂操作系统的默认编码规则:GBK,两者规则不同导致中⽂乱码。
(对于直接传⼆进制数据流时,因为不同编码规则对数字、字母的编码都⼀样,在通过⼆进制解码html⽂件前部分字母是都很正常,中⽂操作系统⽤GBK正常解码⼆进制数据,识别看到meta便知道⽤UTF-8,所以在传html⽂件时要声明类型和编码规则,元数据meta中定义的编码格式等同于在服务器端响应编码格式)
解决⽅案:
声明响应数据的类型(普通⽂本text/plain、html代码text/html等),并告诉浏览器编码格式charset=utf-8;
不管以字符串形式还是⼆进制传的都可以视情况需要在服务器设置响应数据类型:提供数据类型和编码格式给浏览器
发送的数据与对应响应类型:
图⽚需要指定响应类型,但不需要指定编码格式;
⼀般只为字符数据(中⽂、字母、数字、符号等)指定编码格式 utf-8;
如:res.setHeader('Content-Type','text/plain;charset = utf-8')
如:res.setHeader('Content-Type','text/html;charset = utf-8')
特别地:对于响应读取html⽂件的内容时,可以不写上述声明是因为浏览器⾃动识别html代码,并且html代码中meta元数据也可以声明编码格式。
⼗、代码书写风格与分号的使⽤
常见代码书写风格规范:
⼀般推荐不加分号,必须加分号的情况:
以模板字符串``开头的代码前加;
以()开头的代码前加;()
以[]开头的代码前加;[]
⼗⼀、node.js实现 Apache功能
1、实现浏览器输⼊域名+端⼝号/⽂件名,就显⽰服务器上指定⽂件对应的内容;
利⽤if语句判断⽤户输⼊的路径;
利⽤fs模块,针对不同路径到对应⽂件并读取内容(可以直接响应,因为fs.readFile()默认返回的data就是⼆进制(以⼗六进制显⽰),如果要对data进⾏处理可以toString()转为字符串);
2、实现在浏览器显⽰⽂件⽬录功能;
利⽤http核⼼模块创建服务;
利⽤fs.readdir(path[, options], callback)核⼼模块读取⽂件⽬录信息,返回数组形式,⽤于模板引擎替换⽬录数据;
怎么替换?:要使⽤模板引擎内置⽅法:{{each [数组名]}} <p>数组中的{{$value}}</p> {{/each}},遍历数组中每⼀项从⽽⽣产每⼀项利⽤fs.readFile(path[, options], callback)核⼼模块读取⽤于⽬录显⽰的html模板⽂件并结合模板引擎如:art-template第三⽅模块替换⽬录内容(所以要String()将⼆进制先转为字符串,当做替换模板使⽤);
重点:怎么判断⽬录是⽂件夹还是⽂件?也有模块可以实现;
最终将改好的字符串响应给浏览器d(newData),实现在浏览器显⽰⽬录、点击⽬录。
补充:第三⽅art-template模板引擎规则是识别字符串内{{}}中的变量名;(可在前端html页⾯中使⽤,也可以在后端node中安装使⽤)
补充:在Node中使⽤⽅式:
var template =require('art-tmplate')
var ret = String(),{name:'jack'})
//改后的新字符串
⼗⼆、客户端渲染与服务端渲染
渲染:就是将数据以html元素这种浏览器可以识别的⽅式显⽰;
客户端渲染:采⽤ajax等异步操作请求数据,速度更快;但不利于SEO,爬⾍抓不到异步数据(在源代码中看不到数据:如京东商品的评论区分页功能);
服务端渲染:直接传过来带数据的html页⾯,爬⾍在源代码中能到数据,有利于SEO;(在⽹页源代码中可以看到数据,如京东商品展⽰功能)
所以⼀般⽹站前后端渲染都会⽤到,为了更快、也为了SEO。
⼗三、服务器对静态资源的处理
背景:
当我们在html页⾯中使⽤link、script、img、iframe、video、audio等需要再次发请求引⼊静态资源的标签时,其实就是⾃动⼜向服务器发了⼀次请求(请求路径分为:⽹络路径、url⽂件路径会拼接在服
务器地址后⾯;),所以服务器端也会对这些请求做响应。(如果没有响应,浏览器就会⼀直处于等待状态,没法渲染页⾯)
处理⽅式:
服务器将静态资源统⼀放到⼀个⽂件夹public中,然后在html页⾯中通过⽂件路径引⽤,这样可以通过req.url判断只要是以/public/开头的就直接把这个url当做⽂件路径去这个⽂件,然后响应回去;所以html页⾯中使⽤的路径要是⽂件路径。
⼗四、服务器对表单提交的处理
传统req.url返回的是整个根⽬录及以后的部分;包含了路径和query信息;
当客户端使⽤get请求时,服务器要想得到query数据,单从req.url中不容易获取,所以有了专门处理路径的核⼼模块:var url = require('url');
使⽤这个模块的parse⽅法可以得到⼀个路径对象;
var pathObj = url.parse(req.url,true);第⼆个参数⽤于将query的属性值以对象形式呈现,默认是字符串,这⾥会涉及编码格式;
然后就是判断pathObj.pathname路径字符串来决定响应内容;
并向模板中使⽤上pathObj.query对象;
⽐如,添加到已有数组中,并使⽤重定向让页⾯刷新;
重定向:响应设置302状态码(临时重定向,再次发请求,浏览器不记住重定向后的地址,相当于每次都是第⼀次,还是会向原⽹址发请求),浏览器收到这个状态码,就直接去响应头中Location;在响应头中设置Location告诉浏览器重定向的路径;
res.statusCode = 302 res.setHeader('Location','/') d()
但是这⼀步不是数据持久化,服务器⼀重启新加的数据会没有。
⼗四、Node.js的测试⽅法
浏览器中有F12调试⼯具
node中也有调试⼯具:>node命令⾏直接输命令,可以直接⽤node中API,按ctrl+c+c退出。
⼗五、Node.js的模块系统
模块分类:
核⼼模块
第三⽅模块
⾃定义模块
1、Node.js中的模块化基于Commen.JS;
导出的是:ports对象;内部默认ports={}; var exports = ports; ports
所以想导出什么,往对象中添加,⼀般导出单个⽤:ports=;导出多个⽤:exports.属性名=或ports={}
2、require加载规则
优先从缓存加载;缓存有的就不执⾏内部代码,⽽是返回对象ports;
require('fs'):引⼊核⼼模块
require('./aa.js'):引⼊⾃定义模块(路径⽅式)
require('art-template'):引⼊第三⽅模块
核⼼模块、第三⽅模块的加载:在node_module⽂件下的同名⽂件中package.json中的main属性对应的值,如index.js,然后去这个⽂件并执⾏;如果main没有,那默认index.js;本⽂件夹没有则往外package.json、index.js,直到到根⽬录。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论