前端知识点回顾——Nodejs

Node.js


事件循环机制

setImmediate()是将事件插入到事件队列尾部,主线程和事件队列的函数执行完成之后立即执行setImmediate指定的回调函数,和setTimeout(fn,0)的效果差不多

process.nextTick()方法可以在当前"执行栈"的尾部-->下一次Event Loop(主线程读取"任务队列")之前-->触发process指定的回调函数。也就是说,它指定的任务总是发生在所有异步任务之前,当前主线程的末尾。


事件触发器模块Events

const EventEmitter = requier("events").EventEmitter;
const emitter = new EventEmitter;
  • emitter.on(‘eventName‘, callback) 绑定事件

    当事件名为“newListener”时表示监听后续是否添加了新的监听事件,每添加一个新的监听事件都会触发一次并执行回调

  • emitter.off(‘eventName‘, callback) 解绑事件
  • emitter.emit(‘eventName‘) 触发对应的事件,执行绑定在该事件上的回调函数
  • emitter.once(‘eventName‘, callback) 绑定后只触发一次,触发完毕后解绑
  • emitter.setMaxListeners(number) 设置同一事件名能设置的监听事件最大数,默认为10,超出只会警告而不报错
  • emitter.getMaxListeners() 返回 EventEmitter 当前的监听器最大限制数的值
  • emitter.listeners("eventName") 返回名为 eventName 的事件的监听器数组的副本

URL模块

  • URL的解析
const URL = require("url").URL;
const myUrl = new URL("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=nodejs&oq=nodejs&rsv_pq=d7fa015100007271&rsv_t=aa05WH%2FPArCuBuKN337J%2BU6sVgj9%2BXf95e%2F8rq7tN8CgOI2AwwkmOSAGEvs&rqlang=cn&rsv_enter=1&inputT=366&rsv_sug3=12&rsv_sug1=10&rsv_sug7=100&rsv_sug2=0&rsv_sug4=1165&rsv_sug=1");
//返回一个关于这个url相关的信息的实例对象

myUrl.searchParams 返回一个关于这个url相关信息的map结构,需要使用.get()方法取得属性值,没有值的属性为空字符串

  • URL的拼接
const resolve = require("url").resolve;   // url拼接
resolve("user/wula", "51-url-fs");   // user/51-url-fs  处在user的同目录下
resolve("user/wula/", "51-url-fs");   // user/wula/51-url-fs
resolve("user/wula/", "/51-url-fs");   // 51-url-fs   /表示处在根目录下
  • URL的序列化与反序列化
const URL = require("url").URL;
const qs = require("querystring");
const myUrl = new URL("https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_id...");
qs.parse(myUrl.search.slice(1));  //序列化,返回一个对象,里面的键值对为url中的搜索条件
qs.stringify({wula:123, simple:456});   //反序列化, wula=123&simple=456

加密模块crypto

const crypto = require("crypto");
console.log(crypto.getHashes());  //查看hash加密方式有哪些
let pwd = "simple";
const obj = crypto.createHash("sha256");
obj.update(pwd);  //通过加密对象对数据进行加密
console.log(obj.digest());  //得到加密数据,得到一个buffer对象(默认为二进制)
console.log(obj.digest("hex"));  //得到加密数据,以16进制形式表示

文件操控模块fs

const fs = requier('fs');
  • 文件的读取
fs.readFile("./simple.txt", "utf8", (err, data) => {  //路径,字符集 ,回调函数(读取发生错误时候的错误信息, 读取成功得到的数据)
    console.log(err);  //err为null表示读取成功,读取失败为对象,里面存储错误信息
    console.log(data);  //默认以二进制保存的buffer对象,有设置字符集以字符集形式展示
});
fs.readFileSync("./simple.txt", "utf8");  //同步方法,返回值为读取得到的数据
  • 文件的写入
let data = "simple";
fs.writeFile("./test.txt", data, (err) => {
    if (err) throw err;
});
fs.writeFileSync("./test.txt", data);

fs.appendFile(“./test.txt”, “添加的内容”, “utf-8”, err => {});  //非覆盖的添加内容
  • 创建文件夹
fs.mkdir("./01", err => {
    //只能创建一个未知的文件夹,且不能创建多个文件夹
});
  • 读取文件夹目录
fs.readdir("../51", (err, data) => {
    if(err) throw err;
    console.log(data);  //data为一个数组,保存的是该目录下所有文件的文件名
});
  • 判断是否为文件
const stat = fs.statSync("../51");
console.log(stat.isDirectory());  //true为文件夹, false为其他文件
console.log(stat.isFile());  //false为文件夹, true为其他文件
  • 监听文件
fs.watchFile("./wula.txt", (a, b) => {   //监听路径中的文件内容是否进行修改,会在文件内容修改后触发回调函数
    console.log(a);   //a为文件修改前的状态对象
    console.log(b);  //b为文件修改后的状态对象
});

流模块steam

  • 流模块
const fs = require("fs");  //fs模块继承了stream
const read = fs.createReadStream("./simple.txt");  //创建一个读取流,返回一个对象,为暂停状态
// 流有两个状态: 暂停状态  释放状态
read.resume();  //改变流的状态为释放状态,只有为释放状态的时候流才会流动
read.setEncoding("utf-8");  //设置输出数据的字符集
read.on("data", data => {
    //随着流的不断流动会多次触发回调
});  //绑定data事件后可以让流变为释放状态,还会监听流的流动以得到数据(默认为二进制buffer对象)
read.on("end", () => {
});  //监听流的流动,流动结束后触发回调函数
  • 管道服务
const fs =require("fs");
const read = fs.createReadStream("./simple.txt");
const write = fs.createWriteStream("./wula.txt");
read.pipe(write);  //让数据流从读取流流向写入流
write.write(“”);  //往写入流中写入数据,覆盖的
  • 可读流
const Readable =  require("stream").Readable;
const read = new Readable();  //创建一个可读流对象
read.setEncoding("utf-8");
read.push("1");
read.push("2");
read.push("3");
read.push(null);  //在最后push一个null表示数据放完了,不然会报错


HTTP模块

在node中HTTP服务继承自TCP服务器,它能够与多个客户端保持连接,由于其采用事件驱动的形式,并不为每一个连接创建额外的线程或进程,保持很低的内存占用,所以能实现高并发。下面是一个实例。

const http = require("http");
const fs = require('fs');
//创建一个服务
const server = http.createServer((req, res) => {
    // req 请求体对象    res:响应体对象

    //请求体的属性:req.url  req.method  req.httpVersion  req.headers
    //req.headers 返回键值对形式的请求头,以供业务逻辑调用

    //根据请求方法来进行处理
    if (req.method === "GET") {
        res.writeHead(200, {
            "Content-Type": "text/html;charset=utf-8"
        });
        //根据请求路径进行页面渲染
        switch (req.url) {
            case "/wula":
                res.write(fs.readFileSync("./01.html", "utf8"));
                break;
            default:
                res.write(fs.readFileSync("./default.html", "utf8"));
                break;
        }
    }

    //设置响应头
    //设置允许跨域,CROS跨域
    res.setHeader("access-control-allow-origin", "*");
    //setHeader可多次调用设置,但只有调用writeHead后,报头才会写入到连接中
    res.writeHead(200, {
        "Content-Type" : "text/html;charset=utf-8"
    });
    //text/plain :纯文本    text/html:标签

    //写入响应主体
    //res.write可多次调用,res.end调用会先调用write发送数据,然后发送信号告知服务器响应结束
    res.end("<div>结束会话</div>");
});
//监听端口号
// server.listen(3000, "127.0.0.1");
server.listen(3000);
console.log("开始监听3000端口");

http客户端

在node中通过http.request(options,connect)这个API来构造HTTP客户端

比如说要构建一个代理服务器(3003端口),当我向它发起请求的时候它会返回3000端口的响应,这个时候就需要在服务器上创建一个向3000端口的请求。

const http = require("http"),
      request = http.request; //得到请求的api
let options = {
    host : "localhost",  //服务器域名或IP地址
    port : 3000,
    method : "GET"
    /*
    hostname  服务器名字
    path  路径
    headers  请求头
    ...
    */
};
//调用请求方法,返回一个请求对象
let reqObj =  request(options, res => {
    let dataObj = null;
    res.setEncoding("utf8");  //设置响应主体流的编码方式
    res.on("data", data => {
        dataObj = data;
        // console.log(data);  //接收到的数据
    });
    //监听res的end事件
    res.on("end", () => {
        //创建一个服务,等待客户端的请求过来
        http.createServer((req, res) => {
            res.setHeader("Access-Control-Allow-Origin", "*");
            res.write(JSON.stringify(dataObj));
            res.end();
        }).listen(3003, () => {
            console.log("服务正在监听3003端口");
        });
    })
});

//如果请求失败,调用err事件
reqObj.on("error", err => {
    console.log(err);
});

//写入请求主体
reqObj.write("");
reqObj.end();

这样设置后就允许所有向3003端口的请求都会返回3000端口的响应了。

原文地址:https://www.cnblogs.com/simpul/p/11027154.html

时间: 2024-10-09 15:31:02

前端知识点回顾——Nodejs的相关文章

前端知识点回顾——Javascript篇(六)

fetch 在原生ajax+es6promise的基础上封装的一个语法糖,返回promise对象. fetch(url, initObj) .then(res=>res.json()) .then(data=>{ //这里得到返回的json对象,可进行操作 }) .cateh(err){ console.log(err); }; //initObj { body: JSON.stringify(data), // must match 'Content-Type' header cache:

前端知识点回顾之重点篇——jQuery实现的原理

jQuery jQuery的实现原理 参考:https://blog.csdn.net/zhouziyu2011/article/details/70256659 外层沙箱和命名空间$ 为了避免声明了一些全局变量而污染,把代码放在一个"沙箱执行".jQuery具体的实现,都被包含在了一个立即执行的匿名函数构造的闭包里面,然后只暴露 $ 和 jQuery 这2个变量给外界: (function(window, undefined) { // 用一个函数域包起来,就是所谓的沙箱 // 在这

前端知识点回顾——mongodb和mongoose模块

mongodb和mongoose模块 数据库 数据库有关系型数据库(MySQL)和非关系型数据库(mongodb),两者的语法和数据存储形式不一样. mySQL 关系型数据库 类似于表格的形式,每一条数据都是以id为标识 table thead name sex age id tbody May female 18 1 Simple male 25 2 mongodb 非关系型数据库 集合,相当于表的概念,Bson,一条数据代表一个文档(数据的基本单位) { id : name : May ag

前端知识点回顾——koa和模板引擎

koa 基于Node.js的web框架,koa1只兼容ES5,koa2兼容ES6及以后. const Koa = requier("koa"); const koa = new Koa(); //koa.use注册中间件(一个用来处理请求/修饰向服务器发起的请求的异步函数,参数为ctx和next) //每一个请求都会从上往下执行,当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件.当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为. k

Spring知识点回顾(01)

Spring知识点回顾(01) 一.依赖注入 1.声明Bean的注解 @Component @Service @Repository @Controller 2.注入Bean的注解 @Autowired @Inject @Resource 二.加载Bean 1.xml方式 - applicationcontext.xml : Beans, Bean, Component-Scan 2.注解方式 - @Configuration,@ComponentScan,@Bean 用@Configurati

面向对象【day07】:多态-面向对象使用场景--知识点回顾

本节内容 多态 面向对象使用场景 知识点回顾 一.多态 一.概述 多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作.简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针. 那么,多态的作用是什么呢?我们知道,封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):它们的目的都是为了--代码重用.而多态则是为了实现另一个目的--接口重用!多态的作用,就是为了

面试前的准备---C#知识点回顾----03

经过一天的奔波,喜忧参半,不细表 再回看下标题,C#知识点回顾 再看下内容,数据库3NF 原谅我这个标题党 今天继续回忆 1.HTTP中Post和Get区别 这忒简单了吧,大家是不是感觉到兴奋了,长舒一口气了,终于出现了一个可以聊上10分钟的问题了. 根据HTTP规范,Get用于信息获取,而且应该是安全的和幂等的. 参数在URL后,以?分割,以&相连. 根据HTTP规范,Post表示可能修改服务器的资源请求.数据存在HTTP包中 以上最基本的得知道吧,重点可以聊的出现了,安全性. 详细请拜读:h

想询问一个职业规划的问题,前端开发 or nodejs?

先说说个人情况,目前个人定位于初中级前端吧,工作近两年,目前前端开发和nodejs都有一定的了解,水平感觉可以搭一些小型的网站.作为前端开发,目前掌握的技术是javascript,平时更多的是用jquery+模板引擎渲染单页面;nodejs这一块平时开发中更多的使用koa,使用sequelize操作mysql数据库,使用后端模板引擎渲染页面:水平大概是能使用已知的库吧,曾经自己也曾尝试买过ecs,使用nginx做反向代理,搭建服务器. 目前摆在面前的路大方向有两条: 一条是深入学习前端的三大框架

PHP面向对象关键知识点回顾

一,类中的析构函数(__destruct): 析构函数是自动调用的 析构函数主要用于销毁资源 析构函数的调用顺序是先创建的对象最后被销毁(原理是栈的先进后出) 析构函数什么时候被调用 (1)当程序(进程结束)推出时 (2)当一个对象成为垃圾对象时候,该对象的析构方法也会被调用 (3)所谓垃圾对象,就是指没有任何变量再引用它(没有变量再只指向堆中的对象) (4)一旦对象成为垃圾对象,析构函数就会立即被调用 二,类中使用静态变量(static) 静态变量的引入是为了解决不同的对象实例能够共享同一个变