JavaScript全面学习(node.js)

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.jshello.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参数为nulldata参数为读取到的String

读取错误时,err参数代表一个错误对象,dataundefined

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 });
原文地址:https://www.cnblogs.com/shen076/p/6193367.html