NodeJS就是一个独立运行js的解析器。
模块
将代码合理拆分至不同js文件中,每一个文件就是一个模块,文件路径就是模块名。
每个模块都有<u>require</u>、<u>exports</u>、<u>module</u>三个预先定义好的变量可用。
-
require:用于在当前模块加载和使用其他模块,传入模块名,返回一个模块导出对象。
-
exports:是当前模块的导出对象,用于导出模块公有方法和属性。(对应其他模块require得到的对象)
-
module:访问当前模块一些相关信息,替换当前模块的导出对象。
模块解析路径
-
内置模块:不做路径解析,直接返回导出对象。
-
node_modules目录:某模块绝对路径为/home/user/hello.js,并使用require('foo/bar')方式加载时,NodeJS依次使用一下路径
- /home/user/node_modules/foo/bar
- /home/node_modules/foo/bar
- /node_modules/foo/bar
-
NODE_PATH环境变量
文件操作
-
小文件拷贝
var fs = require('fs');
fs.readFileSync(src) //实现读文件操作
fs.writeFileSync(dst) //实现写文件操作 -
大文件拷贝
var fs = require('fs');
fs.createReadStream(src).pipe(fs.createWriteStream(dst));//创建一个只读数据流和一个只写数据流,并用pipe方法将两个数据流连接在一起。 -
Buffer(数据块)
- 全局构造函数Buffer提供对二进制数据的操作,除了可以读取文件得到的Buffer实例外,也可以直接构造。(通过new)
- 可以用.length获取字节长度,也可以使用index方式读取指定位置的字节。
- 可以与字符串互相转化。(toString(‘utf-8’))
- 字符串转换为二进制数据。(new Buffer('hello‘,’utf-8'))
- 区别:字符串只读,修改后原字符串不变。Buffer原数据改变。
-
Stream(数据流)
-
FileSystem(文件系统)
- 文件属性读写:常用有fs.stat、fs.chmod、fs.chown等。
- 文件内容读写:常用有fs.readFile、fs.readdir、fs.writeFile、fs.mkdir等。- 底层文件操作:常用有:fs.open、fs.read、fs.write、fs.close等。
- 注意:基本所有fs模块API的回调参数都有两个。第一个在有错误发生时等于异常对象,第二个始终用于返回API方法执行结果。
-
Path(路径)
- path.normalize:将传入的路径<u>转换</u>为标准路径
- path.join:将传入的多个路径<u>拼接</u>为标准路径
- path.extname:得到文件扩展名
网络操作
HTTP
var http = require('http');
http.createServer(function(req,res){
res.writeHead(200,{'Content-Type':'text-plain'});
res.end('Hello World\n');
}).listen(3000);
'http'模块提供两种使用方式:
-
作为服务器端,创建一个HTTP服务器,监听HTTP客户端请求并返回响应。
-
作为客户端,发起一个HTTP客户端请求,获取服务端,客户端模式如下:
var options = { hostname: 'www.example.com', port: 80, path: '/upload', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; //.request方法创建一个客户端,并设置目标和请求头数据。 var request = http.request(options, function (response) {}); request.write('Hello World'); request.end();
http.get('http://www.xxx.com/',function(res){});
HTTPS
与http模块类似,区别:https模块需要额外处理SSL证书。
服务器模式下,创建一个HTTPS服务器的实例:(<u>可以使用server.addContext('xx.com',{key:xx,cert:xx})方法添加多组证书</u>)
var options = {
//私钥 key: fs.readFileSync('./ssl/default.key'),
//公钥 cert: fs.readFileSync('./ssl/default.cer')
}; var server = https.createServer(options, function (request, response) { // ... });
URL
href
host path
---------------------- -----------------------------------
http: // user:pass @ host.com :8080 /p/a/t/h ?query=string #hash
protocol auth hostname port pathname search hash
Query String
用于实现URL参数字符串与参数对象的互相转换
querystring.parse('foo=bar&baz=qux&baz=quux&corge'); /* =>{ foo: 'bar', baz: ['qux', 'quux'], corge: '' }/ querystring.stringify({ foo: 'bar', baz: ['qux', 'quux'], corge: '' }); / =>'foo=bar&baz=qux&baz=quux&corge='*/
进程管理
-
Process:可以通过process对象感知和控制NodeJS自身进程的方方面面。Process不是内置模块,是一个全局对象。
-
Child_process:该模块可以创建和控制子进程。
-
Cluster:该模块是对child_process模块的进一步封装,专用于解决单进程NodeJS Web服务器无法充分利用多核CPU的问题。
应用场景举例:
-
通过process.argv获取命令行参数。(node执行程序路径和主模块文件路径占据了argv[0]和argv[1]两个位置,所以第一个命令行参数从argv[2]开始。)
- process.argv.slice(2)
-
退出程序。(正常退出程序,退出状态码为0;异常挂起时不为0;)
- process.exit(num);
-
控制输入输出。(标准输入流(stdin)、标准输出流(stdout)、标准错误流(stderr)分别对应process.stdin、process.stdout和process.stderr,第一个为<u>只读</u>数据流,后两个为<u>只写</u>数据流。)
- function log(){
process.stdout.write(
util.format.apply(util,arguments) + '\n'
);
}
- function log(){
网友评论