我们知道,JS在对字符串、数组、数字、布尔值等都有对应的方法api进行操作处理,而在Node中,还需要文件操作、网络通信、操作数据库、数据传输等能力;文件在存储层面都是以二进制形式表示,在http的请求和响应中数据的传输也是以二进制数据进行传输,所以仅仅目前的JS能力还是不够的,也就在Node中提供了buffer模块。
即:使得NodeJS拥有像操作字符串一样来操作处理二进制数据的能力。buffer也被称为临时性暂存区,即临时存放输入和输出二进制数据的一段内存。
在之前的一篇文章NodeJS中stream流的理解中,我们了解到在对大文件进行读取操作时候,一般不会一次性全部读取到内存中,而是以流的形式读取一段数据块,而连续的数据块便形成了数据流的概念。而在对数据块读取和写入过程中,数据首先会存储在buffer(临时性暂存区)的内存中,以待被处理。
buffer对象的内存分配并不是在V8的堆内存中,而是在Node的C++层面实现内存的申请;为了高效的使用申请来得内存,Node中采用slab分配机制(一种动态内存管理机制)。
Node在进程启动时buffer就已经加装进入内存,并将其放入全局对象,使用时候可以无需require引入,但是官方但仍然建议通过 import 或 require 语句显式地引用它。
buffer实例除了可以在文件读取,http请求得到之外,还可以通过手动方式构造创建。
参数:
import { Buffer } from 'buffer';
const buf = Buffer.alloc(8);
console.log(buf);
// <Buffer 00 00 00 00 00 00 00 00>
参数:
import { Buffer } from 'buffer';
const buf = Buffer.allocUnsafe(8);
console.log(buf);
// <Buffer e8 bf 99 e6 98 af e4 b8 80 e6>
创建包含传入string的新buffer
参数:
import { Buffer } from 'buffer';
const buf = Buffer.from('hello buffer');
console.log(buf);
// <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>
使用 0 – 255 范围内的字节 array 分配新的 Buffer。
import { Buffer } from 'buffer';
const array = [0x62, 0x78, 0x84];
const buf = Buffer.from(array);
console.log(buf);
// <Buffer 62 78 84>
参数:
import { Buffer } from 'buffer';
// 新建
const buf1 = Buffer.alloc(10, 2);
// 复制
const buf2 = Buffer.from(buf1);
console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02 02 02>
console.log(buf2);
// <Buffer 02 02 02 02 02 02 02 02 02 02>
将buf实例复制到target目标
import { Buffer } from 'buffer';
const buf1 = Buffer.alloc(10, 2);
const buf2 = Buffer.allocUnsafe(10)
// 将buf1复制到buf2
buf1.copy(buf2);
console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02 02 02>
console.log(buf2);
// <Buffer 02 02 02 02 02 02 02 02 02 02>
返回list中所有buffer实例连接在一起的新buffer
参数:
注意:
import { Buffer } from 'buffer';
const buf1 = Buffer.alloc(4, 2);
const buf2 = Buffer.alloc(4, 3);
const buf3 = Buffer.concat([buf1, buf2]);
console.log(buf1); // <Buffer 02 02 02 02>
console.log(buf2); // <Buffer 03 03 03 03>
console.log(buf3); // <Buffer 02 02 02 02 03 03 03 03>
从buf实例中返回新的Buffer实例,返回的新Buffer实例只是源buf实例的引用,即对新返回的实例修改会影响原有的Buffer实例
参数:
import { Buffer } from 'buffer';
const buf1 = Buffer.alloc(10, 2);
// 截取
const buf2 = buf1.slice(1,4);
// 截取部分修改
buf2[0] = 0x63;
console.log(buf1);
// <Buffer 02 63 02 02 02 02 02 02 02 02>
console.log(buf2);
// <Buffer 63 02 02>
参数:
import { Buffer } from 'buffer';
const buf1 = Buffer.allocUnsafe(8).fill(2);
console.log(buf1);
// <Buffer 02 02 02 02 02 02 02 02>
根据 encoding 中的字符编码将 string 写入 buf 的 offset 处。
注意:length 参数是要写入的字节数。 如果 buf 没有足够的空间来容纳整个字符串,则只会写入 string 的一部分
参数:
import { Buffer } from 'buffer';
// buf1 length为12
const buf1 = Buffer.alloc(12, 3);
// write offset大于buf1.length,写入无效
buf1.write('hello', 12);
console.log(buf1);
// <Buffer 03 03 03 03 03 03 03 03 03 03 03 03>
// 部分写入
buf1.write('hello', 10);
// <Buffer 03 03 03 03 03 03 03 03 03 03 68 65>
检验传入obj是否为buffer
import { Buffer } from 'buffer';
const buf1 = Buffer.alloc(12, 3);
console.log(Buffer.isBuffer(buf1));
// true
检查传入的编码名称是否被Buffer所支持
import { Buffer } from 'buffer';
console.log(Buffer.isEncoding('utf-8'))
// true
Buffer转String
参数:
import { Buffer } from 'buffer';
const buf1 = Buffer.allocUnsafe(26)
for (let i = 0; i < 26; i++) {
// 97 是 'a' 的十进制 ASCII 值。
buf1[i] = i + 97;
}
console.log(buf1.toString())
// abcdefghijklmnopqrstuvwxyz
String转Buffer
参数:
import { Buffer } from 'buffer';
const buf = Buffer.from('hello buffer');
console.log(buf);
// <Buffer 68 65 6c 6c 6f 20 62 75 66 66 65 72>
作者:ktb07
链接:https://juejin.cn/post/7046297380764778509
来源:稀土掘金
关于 Node.js 里 ES6 Modules 的一次更新说明,总结来说:CommonJS 与 ES6 Modules 之间的关键不同在于代码什么时候知道一个模块的结构和使用它。
在这个教程中,我们会开发一个命令行应用,它可以接收一个 CSV 格式的用户信息文件,教程的内容大纲:“Hello,World”,处理命令行参数,运行时的用户输入,异步网络会话,美化控制台的输出,封装成 shell 命令,JavaScript 之外
首先你需要生成https证书,可以去付费的网站购买或者找一些免费的网站,可能会是key或者crt或者pem结尾的。不同格式之间可以通过OpenSSL转换
nodej项目在微信环境开发,nodejs的异步特效,会导致请求没有完成就执行下面的代码,出现错误。经过多方查找,可以使用async模块来异步转同步,只有前一个function执行callback,下一个才会执行。
3G的大文件分1500个2M二进度文件,通post方法发送给node服务,服务器全部接收到文件后,进组装生成你上文件。
JavaScript比C的开发门槛要低,尽管服务器端JavaScript存在已经很多年了,但是后端部分一直没有市场,JavaScript在浏览器中有广泛的事件驱动方面的应用,考虑到高性能、符合事件驱动、没有历史包袱这3个主要原因,JavaScript成为了Node的实现语言。
node.js的第一个基本论点是I / O的性能消耗是很昂贵。因此,使用当前编程技术的最大浪费来自于等待I / O完成。有几种方法可以处理性能影响
在前后端分离的开发中,通过 Restful API 进行数据交互时,如果没有对 API 进行保护,那么别人就可以很容易地获取并调用这些 API 进行操作。那么服务器端要如何进行鉴权呢?
我们经常跟Node.js打交道,即使你是一名前端开发人员 -- npm脚本,webpack配置,gulp任务,程序打包 或 运行测试等。即使你真的不需要深入理解这些任务,但有时候你会感到困惑,会因为缺少Node.js的一些核心概念而以非常奇怪的方式来编码。
运行在 Node.js 之上的 Webpack 是单线程模型的,也就是说 Webpack 需要处理的任务需要一件件挨着做,不能多个事情一起做。happypack把任务分解给多个子进程去并发的执行,子进程处理完后再把结果发送给主进程。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!