node基础
Node
前台JS能用的东西,后台都能用,只是Node里面不涉及样式层,不关注html、css;node提供了很多模块
- 开发相对小规模的web后台、中间层,无法取代java,java高并发的各种特性node无法替代
- 工具
测试、构建(grunt、glup、WebPack……)、抓取
本地启动一个node服务器
-
实现一个简单的server.js文件:
const http = require('http'); // 创建服务器,得到一个服务器对象;每当有请求到这个服务器,都会回调这个方法 let server = http.createServer((request,response)=>{ console.log('node server recive message.'); // 根据请求返回不同的内容 switch (request.url) { case '/aaa': response.write('abc'); break; case '/1.html': response.write('this is 1.html'); break; } response.end(); }); // 开启HTTP服务器监听连接 server.listen(3000);
- 运行NodeJS程序:
进入到js文件所在的目录,执行: node server.js - 当我们访问监听的接口时(如上代码监听的是3000,访问
localhost:3000
,可以看到server接收到了消息
Q: NodeJs能处理并发吗?
NodeJs和Js一样的单线程、单进程。NodeJs采用非阻塞的异步交互。
Q:收到消息打印了2次?
我们使用ie7浏览器,发现只打印了一次,也就是说高级浏览器打印了2次。
打开高级浏览器的开发者工具,可以看到发送请求的时候,浏览器主动去请求了网站小图标,这就是为什么有2条的原因。
assert - 断言
模块提供了一组简单的断言测试,可用于测试不变量,不满足条件的时候程序直接中断。
示例:
const assert = require('assert');
function sum(a, b) {
assert(arguments.length == 2, '必须传2个参数');
assert(typeof a == 'number', '第一个参数必须是数字');
assert(typeof b == 'number', '第二个参数必须是数字');
}
console.log(sum(12));
Buffer - 缓冲器 & fs - 文件系统
Buffer:帮助处理二进制数据,用于在 TCP 流、文件系统操作、以及其他上下文中与八位字节流进行交互。
fs:提供与文件系统进行交互的功能,虽然几乎不使用同步,但任何一个操作同时提供了同步和异步。
读文件示例:
const fs = require('fs');
fs.readFile('1.txt', (err, data) => {
if (err){
console.log('没有找到文件。');
} else {
console.log(data);
}})
文件1.txt存放内容: 12 15 18 20
,可以看到读出来的data并不是我们要的数据,而是显示成16进制的二进制流。
- 直接传递给前端是正常显示的,因为后端和浏览器通过二进制也可以进行正常交互。
- 文本文件,
data.toString()
可以看到原始的数据,注意如果是图片视频等二进制数据,toString就破坏了数据。
C/C++ Addons
可以使用C或C++书写插件,极大的提升性能。
多进程 process
涉及模块:child_process-子进程、cluste-集群、process-进程
进程拥有独立的存储空间,同一个进程内的所有线程共享一套存储空间。
- 多进程:速度更慢,初始化和销毁都需要跟计算机申请。安全,进程之间隔离,写代码更简单。
- 多线程:线程间通信更复杂,写代码更复杂,涉及到多线程同步和锁的问题。
crypto - 加密
crypto 模块提供了加密功能,包括对OpenSSL的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。
const crypto = require('crypto');
function md5(str){
let obj = crypto.createHash('md5');
obj.update(str);
return obj.digest('hex');
}
console.log(md5('123456'));// 16进制显示结果
我们将字符串'123456'使用md5加密,加密后的结果如下:
os - 操作系统
os 模块提供了与操作系统相关的实用方法和属性。
path - 路径
path 模块提供用于处理文件路径和目录路径的实用工具。例如basename、dirname、extname、normalize、relative等。
events - 事件触发器
构建node的异步事件驱动架构,EventEmitter实现自定义的异步事件。
const Event = require('events').EventEmitter;
let ev = new Event();
// 监听(接收)
ev.on('msg', function(a, b, c){
console.log('收到msg事件:', a, b, c);
});
// 派发(发送)
ev.emit('msg', 12, 5, 8);
querystring - 查询字符串
发给服务器查询字符串(url问号后面的字符串)的相关处理,处理为一个json对象。
const querystring = require('querystring');
let obj = querystring.parse('wd=md5&rsv_spt=1&&issp=1&f=8&rsv_bp=1');
console.log(obj);
URL:url
模块用于处理与解析 URL,大部分时候我们还是使用url解析,
const url = require('url');
let obj = url.parse('https://www.baidu.com/s?wd=md5&rsv_spt=1&rsv_iqid=0x82af93ad003be6e4&issp=1&f=8&rsv_bp=1');
console.log(obj);
网络
TCP - 稳定传输 Net
UDP - 快 UDP/Datagram
域名解析
dns - 域名服务器。使用示例:
服务器之间通过ip地址通信,查看一个域名的ip地址,可以直接ping查看IP地址。
dns的resolve实现了同上的域名解析。
const dns = require('dns');
dns.resolve('baidu.com',(err,res) => {
if (err){
console.log('解析失败');
} else {
console.log(res);
}})
stream - 流
连续的数据相关操作,例如:视频流、网络流、文件流、语音流。
TLS/SSL
为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。
zlib - 压缩
gz压缩,结合流使用,压缩后的数据减少传输带宽