You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
const{ spawn }=require('child_process');varls=spawn('ls',['-al'],{stdio: 'inherit'});ls.stdout.on('data',function(data){console.log('data from child: '+data);});ls.stderr.on('data',function(data){console.log('error from child: '+data);});ls.on('close',function(code){console.log('child exists with code: '+code);});
总结NodeJS常用的API,重点地方有笔者的释义以及详细说明。关联度高的模块放一起叙述,并有对比说明,比如buffer与fs,stream与http,process与child_process。本文尽量做到兼具实用与API广度,更多详细内容请看Node.JS官网文档。
path
__filename
。全局值,当前文件绝对路径__dirname
。全局值,当前文件夹绝对路径。等效于path.resolve(__filename, '..')path.join([...paths])
。相当于把所传入的任意多的参数 按照顺序 进行命令行般的推进path.resolve([...paths])
。以当前文件的路径为起点,返回绝对路径。可以理解为每次都是新建cd命令path.dirname(path(string))
。返回指定的路径 所在文件夹的绝对路径path.basename(path(string))
。返回指定Path路径所在文件的名字path.extname(path | string)
。获取指定字符串或者文件路径名字的后缀名,带.比如.txturl
url 模块提供了两套 API 来处理 URL 字符串:一个是Node.js特有的API,是旧版本的遗留;另一个则是实现了WHATWG URL Standard的 API (const {URL} = require('url')方式),该标准也在各种浏览器中被使用。
旧版url api,新版URL Standard见这:
url.parse(urlString[, parseQueryString[, slashesDenoteHost]])
。把url字符串解析为url对象url.format(urlObject)
。把url对象解析为字符串url.resolve(from, to)
。以一种 Web 浏览器解析超链接的方式, 基于一个基础 URL,对目标 URL进行解析。查看其源码实现:querystring
querystring.parse
。一个URL查询字符串 str 解析成一个键值对的集合。querystring.stringify
。遍历给定的 obj 对象的自身属性,生成 URL 查询字符串。Stream
Node中很多数据结构都继承自Stream。Stream在文件系统和http请求中,有非常大的作用。
对于文件处理
,小文件对于buffer数据结构能很好的解决,直接将文件所有数据加载到内存中;但对于大文件,buffer这种方式不可取,容易打爆内存。最好的方式是像流水一样,将读取的数据实时流入到写入的文件,直到数据全部读完并写入好对应目标文件。举个例子,就像两个水池,待读取的文件是一个装满水的池子,写入的空文件是一个等待蓄满水的空池子。通过Stream API的方式,将两个池子嫁接起来,使得满水的池子可以持续注水到空池子中。而且Stream继承自EmitEvents,过程中会有许多回调事件发出,供开发人员自定义内容。对于http请求处理
,最常见的就是通过流去写入内容。以下对象继承了可读流:
Stream类
stream.Writable
stream.Readable
以下举一个完整例子:
http
http.Server
。http.createServer(function(req, res){})返回该类。http.ClientRequest
。Node作为客户端
。http.get()/http.request()返回该类。可写流
。详细参见上章节stream.Writable回调函数res是可读流
http.ServerResponse
。Node作为服务端
。服务端res即是该类的实例。可写流
Buffer
global
在 TCP 流或文件系统操作等场景中处理字节流。Buffer 类是一个全局变量。Buffer 类的实例类似于整数数组,但 Buffer 的大小是固定的、且在 V8 堆外分配物理内存。 Buffer 的大小在创建时确定,且无法改变。
创建Buffer
Deprecated
。推荐使用 Buffer.from(array/string) 和Buffer.alloc(size)代替。Buffer静态方法
Buffer实例
File System
file文件操作
readFile(path[, options], callback)
writeFile(file, data[, options], callback)
copyFile(src, dest[, flags], callback)
rename(oldPath, newPath, callback)。文件重命名
write(fd, string[, positinon[, encoding]], callback)。将 string 写入到 fd 指定的文件写文件
exists(url, callback(boolean))
Deprecated
。查询是否存在,一般用在单纯检查文件
而不去操作(open/readFile/writeFile等操作文件不成立时会回调err)文件时。推荐使用fs.stat() or fs.access() 代替该方法。stat(path[, options],callback(err, stat))。查询文件/目录信息
createReadStream(path[, options])。 指定路径读取,获得Readable Stream。
createWriteStream(path[, options])。创建空的写入流到目标路径,获得Writeable Stream。
dir目录操作
所有文件和文件夹
名称。Process
global
process对象是一个提供当前node进程信息的全局对象,所以该对象不需要require()引入。process同时也是EventEmitter(典型的发布订阅模式案例)的一个实例,所以有.on()等方法。
process.argv
。一个包含命令行参数的数组。第一个元素是’node’,第二个元素是JavaScript文件的文件名。接下来的元素则是附加的命令行参数。process.env
。返回用户设置的环境变量。process.cwd()
。返回当前进程的工作目录process.exit()
。退出当前程序。process signal Events
。当标准POSIX信号被触发(通常是process.kill(signal)或Ctrl+C等操作),nodejs进程可以通过监听对应信号来进行回调。SIGINT
:interrupt,程序终止信号,通常在用户按下CTRL+C时发出,用来通知前台进程终止进程。SIGTERM
:terminate,程序结束信号,通常用来要求程序自己正常退出。process.kill()缺省产生这个信号。child_process
子程序,在node中,child_process这个模块非常重要。熟悉shell脚本的同学,可以用它的异步特性完成很多事情。
异步
创建子程序
有四种方式,后三种底层都是spawn实现的:create child_process
child_process.spawn
。Node.js 的父进程与衍生的子进程之间会建立 stdin、stdout 和 stderr 的管道。options.stdio
: stdio(标准输入输出) 用来配置子进程和父进程之间的 IO 通道,可以传递一个数组或者字符串。如,['pipe', 'pipe', 'pipe'],分别配置:标准输入、标准输出、标准错误。如果传递字符串,则三者将被配置成一样的值。简要介绍其中三个可以取的值:pipe(默认)
:父子进程间建立 pipe 通道,可以通过 stream 的方式来操作 IOinherit
:子进程直接使用父进程的 IO(该种情况使用较多,子进程命令中,执行的node文件里使用process对象与主文件中一致)ignore
:不建立 pipe 通道,不能 pipe、不能监听 data 事件、IO 全被忽略child_process.exec
。创建一个shell,然后在shell里执行命令。执行完成后,将stdout、stderr作为参数传入回调方法。exec 比较适合用来执行 shell 命令,然后获取输出。events
。child_process支持以下事件:exit
。子进程退出。注意其和close的区别,当exit触发时,其stdio流有可能还打开着,可以在此时做一些清理工作。通常情况下,child_process.kill()会触发该事件。close
。当子进程关闭时。通常情况下,child_process.kill()也会触发该事件。error
。当子进程不能关闭时,关闭它会报error事件。调用kill()可能会触发该事件。message
。跟child_process.send方法有关,父子进程间通信。disconnect
。跟child_process.disconnect方法有关。参考文章
The text was updated successfully, but these errors were encountered: