node.js入门 - 10.api:io

简介:   I/O是使node与其他框架与众不同的很重要的一个部分,本章将解释它是如何实现node非堵塞I/O的。   Streams   stream api是一个抽象接口,他帮助node中很多部分实现不间断输入和输出的操作。

  I/O是使node与其他框架与众不同的很重要的一个部分,本章将解释它是如何实现node非堵塞I/O的。

  Streams

  stream api是一个抽象接口,他帮助node中很多部分实现不间断输入和输出的操作。stream api为它的实现类提供了一些通用的方法和属性,streams可以是可读的、可写的或者两者都是,并且他们都实现了EventEmitter,可以emit事件。

   可读streams

  可读streams提供了一系列的方法和事件,使我们可以对数据源的数据进行访问。基本上,可读stream就是为了触发data事件,同时他提供了一些属性允许你对获取的数据大小和获取速度进程配置。来看下面的例子,我们从一个文件中读取文件,每次当有数据可以读取的时候,都会触发data事件。

var fs = require('fs');
var filehandle = fs.readFile('data.txt', function(err, data) {
  console.log(data)
});

  通常我们需要把数据存在一个变量中,当stream结束的时候,一起输出结果。

var spool = "";
stream.on('data', function(data) {
  spool += data;
});
stream.on('end', function() {
  console.log(spool);
});

  

  (文件系统)Filesystem

  当我们需要访问硬盘上文件的时候,我们需要使用filesystem模块。他非常接近于POSIX风格的文件I/O,对所有方法提供异步和同步两种版本。我们推荐使用异步的方法,虽然这样会使代码变的稍微复杂,但是可以让你并行访问多个文件,并减少脚本运行的时间。

  当我们使用异步方法的时候,时常遇到的问题就是代码执行顺序的问题。因为异步方式是不能保证执行顺序的,当一个操作依赖于另外一个操作的时候就会出现问题,如下例:

var fs = require('fs');
fs.readFile('warandpeace.txt', function(e, data) {
  console.log('War and Peace: ' + data);
});
fs.unlink('warandpeace.txt');

   这里存在的问题是,当我们还没有读完文件内容的时候,就有可能执行了文件删除的操作。为了解决这个问题,我们需要稍微修改代码,使用内部回调,如下:

var fs = require('fs');
fs.readFile('warandpeace.txt', function(e, data) {
  console.log('War and Peace: ' + data);
  fs.unlink('warandpeace.txt');
});

 

   Buffers

  虽然node使用javascript作为开发语言,但是他与javascript传统的执行环境是有区别的。例如,浏览器中的javascript更多的是执行函数,而对2进制数据的处理则比较少。虽然javascript支持位运算,但是他没有原生2进制数据的表现形式。node提供了buffer类方便你对2进制数据的操作。

 

   非常重要说明的一点是,当你拷贝一个字符串到Buffer,他们将会以2进制的形式存储,当然你也可以把buffer转换成字符串。可以使用三种参数创建buffer对象,第一种参数是buffer的长度,第二种是bytes数组,第三种是字符串。例如,我们在node REPL输入下面的语句,设置buffer长度为10:

new Buffer(10);

  node会给buffer提供一个长度为10的内存区域,但是这段区域是系统刚释放出来的,里面的内容设置还没来得及清除,所以每次运行上面的语句得到的运行结果是不一样的。

   在node中默认使用utf-8的编码格式,当然你也可以改变编码格式。

new Buffer('foobarbaz');
new Buffer('foobarbaz', 'ascii');
new Buffer('foobarbaz', 'utf8');
new Buffer('é');
new Buffer('é', 'utf8');
new Buffer('é', 'ascii');

   node提供了其他方法去操作buffer,例如Buffer.write()。传入字符串和索引(默认为0)参数,如果buffer有足够的空间,我们将会从指定的索引开始,把buffer内容完全替换成字符串内容;否则我们将会截取字符串,以适应从索引开始位置到结尾的buffer的长度。最后返回修改的buffer内容的长度。

var b = new Buffer(1);
b
b.write('a');
b
b.write('é');
b

  定义一个长度为1的buffer,从索引0开始覆写buffer内容为‘a’,这时buffer内容被修改,索引也增加到1。我们再次覆写buffer内容,这时buffer从索引1开始已经没有空间了,所以覆写失败,buffer内容没有发生变化。执行结果如下,可以说明一切。

  再看一个例子:

var b = new Buffer(5);
b.write('fffff');
b
b.write('ab', 1);
b

  创建一个长度为5的buffer,覆写内容为‘fffff’,从索引1开始覆写内容为‘ab’,我们来看运行结果。

  

  本节课的内容就讲完了,有什么疑问可以给我留言。

目录
相关文章
|
前端开发 JavaScript NoSQL
使用 Node.js、Express 和 React 构建强大的 API
本文详细介绍如何使用 Node.js、Express 和 React 构建强大且动态的 API。从开发环境搭建到集成 React 前端,再到利用 APIPost 高效测试 API,适合各水平开发者。内容涵盖 Node.js 运行时、Express 框架与 React 库的基础知识及协同工作方式,还涉及数据库连接和前后端数据交互。通过实际代码示例,助你快速上手并优化应用性能。
|
Kubernetes API 网络安全
当node节点kubectl 命令无法连接到 Kubernetes API 服务器
当Node节点上的 `kubectl`无法连接到Kubernetes API服务器时,可以通过以上步骤逐步排查和解决问题。首先确保网络连接正常,验证 `kubeconfig`文件配置正确,检查API服务器和Node节点的状态,最后排除防火墙或网络策略的干扰,并通过重启服务恢复正常连接。通过这些措施,可以有效解决与Kubernetes API服务器通信的常见问题,从而保障集群的正常运行。
1325 17
|
JSON 缓存 JavaScript
深入浅出:使用Node.js构建RESTful API
在这个数字时代,API已成为软件开发的基石之一。本文旨在引导初学者通过Node.js和Express框架快速搭建一个功能完备的RESTful API。我们将从零开始,逐步深入,不仅涉及代码编写,还包括设计原则、最佳实践及调试技巧。无论你是初探后端开发,还是希望扩展你的技术栈,这篇文章都将是你的理想指南。
|
JSON JavaScript 前端开发
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发作为连接用户与数据的桥梁,扮演着至关重要的角色。本文将引导您步入Node.js的奇妙世界,通过实践操作,掌握如何使用这一强大的JavaScript运行时环境构建高效、可扩展的RESTful API。我们将一同探索Express框架的使用,学习如何设计API端点,处理数据请求,并实现身份验证机制,最终部署我们的成果到云服务器上。无论您是初学者还是有一定基础的开发者,这篇文章都将为您打开一扇通往后端开发深层知识的大门。
495 12
|
JavaScript NoSQL API
深入浅出Node.js:从零开始构建RESTful API
在数字化时代的浪潮中,后端开发如同一座灯塔,指引着数据的海洋。本文将带你航行在Node.js的海域,探索如何从一张白纸到完成一个功能完备的RESTful API。我们将一起学习如何搭建开发环境、设计API结构、处理数据请求与响应,以及实现数据库交互。准备好了吗?启航吧!
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API
使用JavaScript和Node.js构建简单的RESTful API
|
JSON JavaScript API
深入浅出Node.js:从零开始构建RESTful API
【10月更文挑战第39天】 在数字化时代的浪潮中,API(应用程序编程接口)已成为连接不同软件应用的桥梁。本文将带领读者从零基础出发,逐步深入Node.js的世界,最终实现一个功能完备的RESTful API。通过实践,我们将探索如何利用Node.js的异步特性和强大的生态系统来构建高效、可扩展的服务。准备好迎接代码和概念的碰撞,一起解锁后端开发的新篇章。
|
JavaScript 中间件 API
Node.js进阶:Koa框架下的RESTful API设计与实现
【10月更文挑战第28天】本文介绍了如何在Koa框架下设计与实现RESTful API。首先概述了Koa框架的特点,接着讲解了RESTful API的设计原则,包括无状态和统一接口。最后,通过一个简单的博客系统示例,详细展示了如何使用Koa和koa-router实现常见的CRUD操作,包括获取、创建、更新和删除文章。
460 4
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
695 0
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
JavaScript 前端开发 NoSQL
深入浅出:使用Node.js构建RESTful API
【10月更文挑战第35天】在数字时代的浪潮中,后端技术如同海洋中稳固的灯塔,为前端应用提供数据和逻辑支撑。本文旨在通过浅显易懂的方式,带领读者了解如何利用Node.js这一强大的后端平台,搭建一个高效、可靠的RESTful API。我们将从基础概念入手,逐步深入到代码实践,最终实现一个简单的API示例。这不仅是对技术的探索,也是对知识传递方式的一次创新尝试。让我们一起启航,探索Node.js的奥秘,解锁后端开发的无限可能。