- 在javascript有且仅有一个全局对象,在浏览器中,叫window对象。
- 在node.js中,也有且仅有一个全局对象,叫global。
- process也是Node.js提供的一个对象,它代表当前Node.js进程。
- node 是由事件驱动执行的单线程模型,不断执行事件响应
- 想在下一次事件响应中执行代码,可以调用
process.nextTick(function(){})
- Node.js进程本身的事件就由process对象来处理。如果我们响应exit事件,就可以在程序即将退出时执行某个回调函数
process.on('exit', function(){})
有很多JavaScript代码既能在浏览器中执行,也能在Node环境执行,但有些时候,程序本身需要判断自己到底是在什么环境下执行的,常用的方式就是根据浏览器和Node环境提供的全局变量名称来判断:
1. if (typeof(window) === 'undefined') {
2. console.log('node.js');
3. } else {
4. console.log('browser');
5. }
- Node.js内置的fs模块就是文件系统模块,负责读写文件。和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法
- 同步读取的函数和异步函数相比,多了一个Sync后缀,并且不接收回调函数,函数直接返回结果。如果同步读取文件发生错误,则需要用try...catch捕获该错误。
- 如果我们要获取文件大小,创建时间等信息,可以使用fs.stat(),它返回一个Stat对象,能告诉我们文件或目录的详细信息
- 服务器启动时如果需要读取配置文件,或者结束时需要写入到状态文件时,可以使用同步代码,因为这些代码只在启动和结束时执行一次,不影响服务器正常运行时的异步执行
-
stream: 在Node.js中,流也是一个对象,我们只需要响应流的事件就可以了:data事件表示流的数据已经可以读取了,end事件表示这个流已经到末尾了,没有数据可以读取了,error事件表示出错了。
- 就像可以把两个水管串成一个更长的水管一样,两个流也可以串起来。一个Readable流和一个Writable流串起来后,所有的数据自动从Readable流进入Writable流,这种操作叫pipe.在Node.js中,Readable流有一个pipe()方法,就是用来干这件事的。
- 让我们用pipe()把一个文件流和另一个文件流串起来,这样源文件的所有数据就自动写入到目标文件里了,所以,这实际上是一个复制文件的程序
1. 'use strict';
2. var fs = require('fs');
3. var rs = fs.createReadStream('sample.txt');
4. var ws = fs.createWriteStream('copied.txt');
5. rs.pipe(ws);
- 默认情况下,当Readable流的数据读取完毕,end事件触发后,将自动关闭Writable流。如果我们不希望自动关闭Writable流,需要传入参数:
readable.pipe(writable, { end: false });
HTTP服务器
- 要开发HTTP服务器程序,从头处理TCP连接,解析HTTP是不现实的。这些工作实际上已经由Node.js自带的http模块完成了。应用程序并不直接和HTTP协议打交道,而是操作http模块提供的request和response对象。
- request对象封装了HTTP请求,我们调用request对象的属性和方法就可以拿到所有HTTP请求的信息;
- response对象封装了HTTP响应,我们操作response对象的方法,就可以把HTTP响应返回给浏览器