1.在Node交互式环境下,我们可以输入JavaScript代码并立刻执行,立即看到结果。按两次CTRL+C可以退出编辑。
在命令行模式下,要node ,然后输入带.js的文件。这个JS文件里面要console.log(),才能在命令行看到结果
2.hello.js
'use strict';var s = 'Hello';function greet(name) { console.log(s + ', ' + name + '!');}module.exports = greet; // 把函数greet作为模块的输出暴露出去,这样其他模块就可以使用greet函数
main.js
'use strict';// 引入hello模块:var greet = require('./hello'); // main.js和hello.js位于同一个目录,所以一个点var s = 'Michael';greet(s); // Hello, Michael!
在nodejs中每个.js
文件都是一个模块,它们内部各自使用的变量名和函数名都互不冲突
在浏览器中,如果在a.js
中使用了全局变量s
,那么,在b.js
中也使用全局变量s
,将造成冲突
3.在浏览器中,有且仅有一个全局对象,window。在node.js中,也只有一个,global
process对象代表当前Node.js进程
如果我们想要在下一次事件响应中执行代码,可以调用process.nextTick()
:
// test.js// process.nextTick()将在下一轮事件循环中调用:process.nextTick(function () { console.log('nextTick callback!');});console.log('nextTick was set!');/*输出:nextTick was set!nextTick callback!*/
4.
// 程序即将退出时执行回调函数:process.on('exit', function (code) { console.log('about to exit with code: ' + code);});
5.判断JavaScript执行环境是浏览器还是node.js
if (typeof(window) === 'undefined') { console.log('node.js');} else { console.log('browser');}
6.fs
模块就是文件系统模块,负责读写文件,同时提供了异步和同步的方法。
异步方法:执行IO操作时,JavaScript代码无需等待,而是传入回调函数后,继续执行后续JavaScript代码
$.getJSON('http://example.com/ajax', function (data) { console.log('IO结果返回后执行...');});console.log('不等待IO结果直接执行后续代码...');
同步方法:需要等待函数返回。同步操作的好处是代码简单,缺点是程序将等待IO操作,在等待时间内,无法响应其它任何事件。
// 根据网络耗时,函数将执行几十毫秒~几秒不等:var data = getJSONSync('http://example.com/ajax');
7.异步读取一个文本文件:
'use strict';var fs = require('fs');fs.readFile('sample.txt', 'utf-8', function (err, data) { //sample.txt文件必须在当前目录下,且文件编码为utf-8 if (err) { console.log(err); } else { console.log(data); }});
正常读取时,err
参数为null
,data
参数为读取到的String
读取错误时,err
参数代表一个错误对象,data
为undefined
Node.js标准的回调函数:第一个参数代表错误信息,第二个参数代表结果。
8.异步读取一个图片文件:
'use strict';var fs = require('fs');fs.readFile('sample.png', function (err, data) { if (err) { console.log(err); } else { console.log(data); //回调函数的data参数将返回一个Buffer对象 console.log(data.length + ' bytes'); }});
把一个Buffer
对象转换成String:
// Buffer -> Stringvar text = data.toString('utf-8');console.log(text);
把一个String转换成Buffer
:
// String -> Buffervar buf = new Buffer(text, 'utf-8');console.log(buf);
9.同步读取一个文本文件:
'use strict';var fs = require('fs');var data = fs.readFileSync('sample.txt', 'utf-8'); //多了一个Sync后缀,并且不接收回调函数,函数直接返回结果console.log(data);
如果同步读取文件发生错误,则需要用try...catch
捕获该错误:
try { var data = fs.readFileSync('sample.txt', 'utf-8'); console.log(data);} catch (err) { // 出错了}
10.将数据写入文件通过fs.writeFile()
实现:
'use strict';var fs = require('fs');var data = 'Hello, Node.js';fs.writeFile('output.txt', data, function (err) { if (err) { console.log(err); } else { console.log('ok.'); }});
同步方法:
'use strict';var fs = require('fs');var data = 'Hello, Node.js';fs.writeFileSync('output.txt', data);
11.如果我们要获取文件大小,创建时间等信息,可以使用fs.stat(),返回一个
Stat
对象:
'use strict';var fs = require('fs');fs.stat('sample.txt', function (err, stat) { if (err) { console.log(err); } else { // 是否是文件: console.log('isFile: ' + stat.isFile()); // 是否是目录: console.log('isDirectory: ' + stat.isDirectory()); if (stat.isFile()) { // 文件大小: console.log('size: ' + stat.size); // 创建时间, Date对象: console.log('birth time: ' + stat.birthtime); // 修改时间, Date对象: console.log('modified time: ' + stat.mtime); } }});/*结果如下:isFile: trueisDirectory: falsesize: 181birth time: Fri Dec 11 2015 09:43:41 GMT+0800 (CST)modified time: Fri Dec 11 2015 12:09:00 GMT+0800 (CST)*/
因为node.js绝大部分是需要在服务器运行期反复执行业务逻辑的代码,必须使用异步代码
12.stream
是Node.js提供的又一个仅在服务区端可用的模块,目的是支持“流”这种数据结构。
data
事件表示流的数据已经可以读取了,end
事件表示这个流已经到末尾了,没有数据可以读取了,error
事件表示出错了。
从文件流读取文本内容:
'use strict';var fs = require('fs');// 打开一个流:var rs = fs.createReadStream('sample.txt', 'utf-8');rs.on('data', function (chunk) { // data事件可能会有多次 console.log('DATA:') console.log(chunk);});rs.on('end', function () { console.log('END');});rs.on('error', function (err) { console.log('ERROR: ' + err);});
13.以流的形式写入文件:
'use strict';var fs = require('fs');var ws1 = fs.createWriteStream('output1.txt', 'utf-8');ws1.write('使用Stream写入文本数据...\n');ws1.write('END.');ws1.end();var ws2 = fs.createWriteStream('output2.txt');ws2.write(new Buffer('使用Stream写入二进制数据...\n', 'utf-8'));ws2.write(new Buffer('END.', 'utf-8'));ws2.end();
所有可以读取数据的流都继承自stream.Readable
,所有可以写入的流都继承自stream.Writable
14.Readable
流有一个pipe()
方法,把Readable
流和一个Writable
流串起来后,使所有的数据自动从Readable
流进入Writable
流
源文件的所有数据就自动写入到目标文件
'use strict';var fs = require('fs');var rs = fs.createReadStream('sample.txt');var ws = fs.createWriteStream('copied.txt');rs.pipe(ws); //把rs里面的内容写入ws,即sample.txt不变
当Readable
流的数据读取完毕,end
事件触发后,将自动关闭Writable
流。如果我们不希望自动关闭Writable
流,需要传入参数:
readable.pipe(writable, { end: false });