【Web全栈课程6】nodejs模块简介

小叶子

node基础

官网:http://nodesjs.org

Node
前台JS能用的东西,后台都能用,只是Node里面不涉及样式层,不关注html、css;node提供了很多模块

  1. 开发相对小规模的web后台、中间层,无法取代java,java高并发的各种特性node无法替代
  2. 工具
    测试、构建(grunt、glup、WebPack……)、抓取

本地启动一个node服务器

  1. 实现一个简单的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('<html><head></head><body>this is 1.html</body></html>');
                break;
        }
        response.end();
    });
    // 开启HTTP服务器监听连接
    server.listen(3000);
  2. 运行NodeJS程序:
    进入到js文件所在的目录,执行: node server.js
  3. 当我们访问监听的接口时(如上代码监听的是3000,访问localhost:3000,可以看到server接收到了消息

clipboard.png
访问http://localhost:3000/1.html时,返回响应的内容到前端。
image.png

Q: NodeJs能处理并发吗?
NodeJs和Js一样的单线程、单进程。NodeJs采用非阻塞的异步交互。

Q:收到消息打印了2次?
我们使用ie7浏览器,发现只打印了一次,也就是说高级浏览器打印了2次。
打开高级浏览器的开发者工具,可以看到发送请求的时候,浏览器主动去请求了网站小图标,这就是为什么有2条的原因。
clipboard.png

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));

image.png

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进制的二进制流。
image.png

  1. 直接传递给前端是正常显示的,因为后端和浏览器通过二进制也可以进行正常交互。
  2. 文本文件,data.toString()可以看到原始的数据,注意如果是图片视频等二进制数据,toString就破坏了数据。

C/C++ Addons

可以使用C或C++书写插件,极大的提升性能。

多进程 process

涉及模块:child_process-子进程、cluste-集群、process-进程
进程拥有独立的存储空间,同一个进程内的所有线程共享一套存储空间。
image.png

  • 多进程:速度更慢,初始化和销毁都需要跟计算机申请。安全,进程之间隔离,写代码更简单。
  • 多线程:线程间通信更复杂,写代码更复杂,涉及到多线程同步和锁的问题。

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加密,加密后的结果如下:
image.png

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);

image.png

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);

image.png
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);

image.png

网络

TCP - 稳定传输 Net
UDP - 快 UDP/Datagram

域名解析

dns - 域名服务器。使用示例:
服务器之间通过ip地址通信,查看一个域名的ip地址,可以直接ping查看IP地址。
image.png
dns的resolve实现了同上的域名解析。

const dns = require('dns');
dns.resolve('baidu.com',(err,res) => {
if (err){
    console.log('解析失败');
} else {
    console.log(res);
}})

image.png

stream - 流

连续的数据相关操作,例如:视频流、网络流、文件流、语音流。

TLS/SSL

为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。

zlib - 压缩

gz压缩,结合流使用,压缩后的数据减少传输带宽

阅读 578

一只萌萌的程序媛妹子,踏入前端领域不久,希望大家多指导,欢迎大家多多指出问题

69 声望
11 粉丝
0 条评论
你知道吗?

一只萌萌的程序媛妹子,踏入前端领域不久,希望大家多指导,欢迎大家多多指出问题

69 声望
11 粉丝
宣传栏