zoukankan      html  css  js  c++  java
  • 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 });
  • 相关阅读:
    基于XMPP的即时通信系统的建立 — XMPP IQ详解
    XMPPManager 解析
    Xcode 工程文件“.xcodeproj”文件夹解析
    Description &&debugDescription && runtime(debug模式下调试model)
    day04作业
    数字、字符串、列表、字典,jieba库,wordcloud词云
    if,for,异常,random模块,计算圆周率
    day03
    day02
    计算机基础
  • 原文地址:https://www.cnblogs.com/shen076/p/6193367.html
Copyright © 2011-2022 走看看