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 -> String var text = data.toString('utf-8'); console.log(text);
把一个String转换成Buffer
:
// String -> Buffer var 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: true isDirectory: false size: 181 birth 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写入文本数据... '); ws1.write('END.'); ws1.end(); var ws2 = fs.createWriteStream('output2.txt'); ws2.write(new Buffer('使用Stream写入二进制数据... ', '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 });