nodejs學習筆記

安裝


先從從官網下載安裝node,而後webstrom裏面配置nodejs的提示。css

win8安裝nodejs須要取得管理者權限html

1.把安裝文件放到C:windowsinstaller這個路徑下
2.用管理員權限打開cmd,在裏面輸入C:windowsinstaller這個路徑下的msi安 裝程序,回車便可解決
3.在webstrom裏面配置nodejs的提示,須要下載包,在setting裏node設置,在線下載nodejs.tar.gz完畢後進行項目勾選。node


模塊

模塊的使用

什麼是模塊web

  • 一個文件就是一個模塊json

  • 每一個模塊都有本身的做用域windows

  • 咱們用var聲明的一個變量並非全局的,是屬於當前模塊下的,因此若是用 global訪問會出現undefinedapi

__filename : 當前文件被解析事後的絕對路徑
也是當前模塊的數組

模塊加載系統require('模塊');

**注意路徑問題瀏覽器

例如:定義一個node2.js的文件服務器

console.log("這是node2.js");

要想在node1.js裏面引用能夠用

require('./node2.js')//這是node2.js

模塊加載機制的兩個問題

1.加載路徑

require('模塊加載的路徑')

路徑能夠寫相對路徑或者絕對路徑

2.文件查找特色:

  • 首先按照加載的模塊的文件名稱進行查找

  • 若是沒有找到,則會在模塊文件名稱後加上.js的後綴,進行查找

  • 若是尚未找到,則會在文件名稱後加上.json的後綴,進行查找

  • 若是尚未,則會在文件名稱後加上.node的後綴,進行查找

  • 若是尚未,會拋出錯誤 文件名稱> .js >.json>.node >錯誤

模塊-module和exports

在一個模塊中經過var定義的變量,其做用域範圍是當前模塊,外部不可以直接的訪問。
若是咱們想一個模塊可以訪問另一個模塊中定義的變量,能夠:

  • 1.把變量做爲global對象的一個屬性,可是這樣的作法是推薦

  • 2.使用模塊對象 module

module:保存提供和當前模塊有關的一些信息,能夠經過

console.log(module)

來查看都有哪些屬性。
在這個module對象,又一個子對象exports對象,咱們能夠經過這個對象對一個模塊中的局部變量對象進行提供訪問。

在node5.js中寫入

var a=100;
module.exports.a=a;

在node4.js中引入

var m5=require('./node5');//這個方法的返回值,其實就是被加載模塊中的module.export
console.log(m5);//{ a: 100 }

在模塊做用域內,除了module.exports還有一個內置模塊對象,exports, 他其實就是module.exports
例如:如下對象和對象的比較

console.log(module.exports==exports)//true

返回值是true
因此上面node5.js裏面也能夠寫爲

exports.a=a;

node4模塊輸入結果同樣。
另在定義的一些細節時要儘可能不去破壞它們的引用關係,也就是說若是不是賦值,而是從新定義,exports和module.exports的指向關係已經斷開了

module.exports=[1,2,3]
//若是不是賦值,而是從新定義,exports和module.exports的指向關係已經斷開了
exports.a = 200;
exports=[1,2,3]//這種定義也會斷開

因此要儘可能添加屬性,而不是修改指向關係

全局對象

如下開始介紹一些內置API裏面的屬性,能夠對照中文文檔學習。

global

全局命名空間對象

__filename 和 __dirname

  • __filename : 返回當前模塊文件解析後的絕對路徑,該屬性其實並不是全局的,而是模塊做用域下的

  • __dirname : 返回當前模塊文件所在目錄解析後的絕對路徑,該屬性也不是全局的,而是模塊做用域下的。

也就是說要以下寫法輸出

console.log(__dirname);
console.log(__filename);

而不能加global.__filename

除了這兩個屬性還有全局對象下不少其它的屬性和方法。
如:數組arrayvar d = new Date();,日期datevar arr = new Array(1,2,3);
全局下還有setTimeout等屬性,具體參看全局對象API
例如:作一個命令行形式的時鐘

setInterval(function() {
    var d = new Date();
    console.log( '如今是:' + d.getFullYear() + '年' + (d.getMonth() + 1) + '月' + d.getDate() + '日 ' + d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() );
}, 1000);

process進程對象

process是一個全局對象,能夠在任何地方訪問到它,經過這個對象提供的屬性和方法,可讓咱們對當前運行的程序的進程進行訪問和控制。

包含不少參數

  • argv

process.argv 包含命令行參數的數組。第一個元素是'node',第二個參數是 JavaScript 文件的名字,第三個參數是任意的命令行參數。

console.log(process.argv); //[ 'C:\\Program Files\\nodejs\\node.exe','d:\\wamp\\www\\nodejs\\node6.js' ]

process.execPath 開啓當前進程的執行文件的絕對路徑。

process.env 返回用戶環境信息

process.version 返回node版本信息

process.versions 返回node及其依賴包的版本信息

process.pid 當前進程的 PID 任務管理器裏面的詳細信息pid

process.title 當前進程的顯示名稱 (Getter/setter) 獲取/設置

process.arch 返回當前 CPU 的架構:'arm'、'ia32' 或者 'x64'

process.platform 返回當前操做系統平臺

process.cwd() 返回當前進程的工做目錄

process.chdir(directory) 改變當前進程的工做目錄

process.kill(pid)向進程發出信息

exit(code) 退出

setInterval(function(){
        var d=new Date();
       console.log('如今的日期是:'+ d.getFullYear()+'年'+ (d.getMonth()+1)+'月'+ d.getDay()+'日 '+ d.getHours()+':'+ d.getMinutes()+':'+ d.getSeconds())
    
    },1000)
    
    setTimeout(function(){
        process.exit()
    },5000)

process.memoryUsage() 返回 Node 進程的內存使用狀況,單位爲byte

還有不少方法具體查看文檔

stdin、stdout 標準輸入輸出流(IO)

概念理解

  • 標準輸入設備 具體概念請百度

  • 標準輸出設備 具體概念請百度

  • stdin和stdout提供了操做輸入數據和輸出數據的方法,咱們也一般稱爲IO操做

stdin 標準輸入流
stdout 標準輸出流

//process.stdout.write('hello');
function Log(data){
    process.stdout.write(data);
}
Log('你好')

老的流模式默認狀況下輸入流是關閉的,要監聽處理輸入流數據,首先要先開啓

process.stdin.resume();//開啓
//用於監聽用戶的輸入數據
process.stdin.on('data',function(chunk){
console.log('用戶輸入了'+chunk);//用戶回車了纔會觸發
});

案例:計算加減乘數

var a,b;
process.stdout.write('請輸入a的值:');
process.stdin.on('data',function(chunk){
    //判斷若是a不存在執行
    if(!a){
        a=Number(chunk);
        process.stdout.write('請輸入b的值:');
    }
    else{
        b=Number(chunk);
        process.stdout.write('結果是:'+(a+b));
    }
});

Buffer類

做用:一個用於更好的操做二進制數據的類
咱們在操做文件或者網絡數據的時候,其實操做的就是二進制數據流,node爲咱們提供了一個更加方便的去操做,這種數據流的類Buffer,它是一個全局的類
三種構造方式

new Buffer(size) 分配一個長度
new Buffer(array)
new Buffer(str[, encoding])

new Buffer(size) size[number]建立一個Buffer對象,併爲這個對象分配一個大小。
當咱們爲一個Buffer對象分配空間大小之後,其長度是固定的,不能更改

var bf=new Buffer(5);//5個長度的大小`
    console.log(bf);//<Buffer 00 00 00 00 00>
    bf[1]=20;//增長內容
    console.log(bf);//<Buffer 00 14 00 00 00>  這是以十六進制的方式顯示
    var bf=new Buffer([1,2,3,4]);
    console.log(bf);//<Buffer 01 02 03 04>
    bf[10]=10;//增長內容
    console.log(bf);//<Buffer 01 02 03 04> 其長度是固定的,不能更改
    
    var bf=new Buffer('cmdmarkd','utf-8');
    console.log(bf);//<Buffer 63 6d 64 6d 61 72 6b 64>把字符串轉化編碼

另檢測字符串的 bf.length 指的是當前內容的字節長度並非字符串的長度

var bf = new Buffer('markdown', 'utf-8');
console.log(bf);//<Buffer 6d 61 72 6b 64 6f 77 6e>

for (var i=0; i<bf.length; i++) {
    console.log( String.fromCharCode( bf[i] ) );
}
/*
打印結果:
<Buffer 6d 61 72 6b 64 6f 77 6e>
m
a
r
k
d
o
w
n
7
7
3
9*/

比較字節和字符串長度

var str1 = 'cdmarkd';
var bf1 = new Buffer(str1);
console.log(str1.length);//7
console.log(bf1.length);//7

var str2 = '學習中';
var bf2 = new Buffer(str2);
console.log(str2.length);//3
console.log(bf2.length);//9

buf.length 返回這個 buffer 的 bytes 數

buf[index] 獲取或設置指定 index 位置的 8 位字節

buf.write(string, offset[, encoding])
根據參數 offset 偏移量和指定的 encoding 編碼方式,將參數 、string數據寫入buffer。
buf.write(要寫入的字符串, 從Buffer對象中的幾位開始寫入, 寫入的字符串的長度, 寫入的字符串的編碼)

var str = 'down';
console.log( new Buffer(str) );//<Buffer 64 6f 77 6e>
var bf = new Buffer(2);//規定2個字節
bf.write( str );
console.log(bf);//<Buffer 64 6f>

以上代碼能夠看出,多餘的部分被buffer截斷了,因此寫入的時候注意字符截取的問題。

var str = 'down';
console.log( new Buffer(str) );//<Buffer 64 6f 77 6e>
var bf = new Buffer(3);
bf.write(str,1);//偏移量指的是buffer的,就是從buffer的那一位算起,把字符串寫入到字符串中的第一位
console.log(bf);//<Buffer 00 64>
bf.write(str, 1,3);//寫入三個字符到str中
console.log(bf); //<Buffer 00 64 6f>

var bf = new Buffer('markdwon');
console.log( bf.toString() );//markdwon
console.log( bf.toString('utf-8', 1, 3) );//ar

var bf2 = new Buffer('學習');//存的是十六進制
console.log(bf2);//<Buffer e5 ad a6 e4 b9 a0>
console.log( bf2.toString('utf-8', 1) ); //存的是十六進制.中文打印出來的是亂碼


console.log( bf.toJSON() ); //{ type: 'Buffer',data: [ 109, 97, 114, 107, 100, 119, 111, 110 ] }

FileSystem

1.文件系統模塊 require('fs')
2.該模塊是核心模塊,須要使用reqire導入後使用
3.該模塊提供了操做文件的一些API

fs.open(path, flags, [mode], callback)
  • path : 要打開的文件的路徑

  • flags : 打開文件的方式 讀/寫

  • mode : 設置文件的模式 讀/寫/執行 4/2/1

  • callback : 回調

  • err : 文件打開失敗的錯誤保存在err裏面,若是成功err爲null

  • fd : 被打開文件的標識,和定時器

fs.open('1.txt', 'r', function(err, fd) {
        if (err) {
            console.log( '文件打開失敗' );
        } else {
            console.log( '文件打開成功' );
            console.log( fd );
        }
    
    });

openSync

var fd = fs.openSync('1.txt', 'r');
console.log(fd);

fs.read(fd, buffer, offset, length, position, callback)

  • fd : 經過open方法成功打開一個文件返回的編號

  • buffer : buffer對象

  • offset : 新的內容添加到buffer中的起始位置

  • length : 添加到buffer中內容的長度

  • position :讀取的文件中的起始位置

  • callback : 回調

  • err

  • buffer的長度

  • buffer對象

var fs = require('fs');

fs.open('1.txt', 'r', function(err, fd) {

    if (err) {
        console.log('文件打開失敗');
    } else {


        var bf1 = new Buffer('123456789');

        console.log(bf1);//<Buffer 31 32 33 34 35 36 37 38 39>

        fs.read( fd, bf1, 0, 4, null, function( err, len, newBf ) {

            console.log( bf1 );//<Buffer 61 62 63 64 35 36 37 38 39>
            console.log( len );4
            console.log( newBf );//<Buffer 61 62 63 64 35 36 37 38 39>

        } );

    }

});

當咱們要對打開的文件進行寫操做的時候,打開文件的模式應該是 讀寫 方式
fs.write(fd, buffer, offset, length[, position], callback)

  • fd : 打開的文件

  • buffer : 要寫入的數據

  • offset : buffer對象中要寫入的數據的起始位置

  • length : 要寫入的buffer數據的長度

  • position : fd中的起始位置

  • callback : 回調
    其餘詳見api文檔

項目構建

//項目構建
var projectData = {

    'name' : 'noedTest', //項目名稱
    'fileData' : [  //建立的文件
        {
            'name' : 'css',
            'type' : 'dir'
        },
        {
            'name' : 'js',
            'type' : 'dir'
        },
        {
            'name' : 'images',
            'type' : 'dir'
        },
        {
            'name' : 'index.html',
            'type' : 'file',
            'content' : '<html>\n\t<head>\n\t\t<title>title</title>\n\t</head>\n\t<body>\n\t\t<h1>Hello</h1>\n\t</body>\n</html>',
        }
    ]

};

var fs = require('fs');
//判斷
if ( projectData.name ) {
    fs.mkdirSync(projectData.name);

    var fileData = projectData.fileData;

    if ( fileData && fileData.forEach ) { //存在而且是個數組

        fileData.forEach(function(f) {//遍歷數組

            f.path = projectData.name + '/' + f.name;//路徑

            f.content = f.content || '';

            switch (f.type) {

                case 'dir':
                    fs.mkdirSync(f.path);
                    break;

                case 'file':
                    fs.writeFileSync(f.path, f.content);
                    break;

                default :
                    break;

            }

        });

    }

}

自動合併

var fs = require('fs');

var filedir = './noedTest/source';
//監聽文件
fs.watch(filedir,function(ev,file){
    //console.log(ev + ' / ' + file); // 這裏不須要判斷file是否有內容
    //只要有一個文件發生了變化,咱們就須要對這個文件夾下的全部文件進行讀取,而後合併
    fs.readdir(filedir, function(err, dataList){
        var arr = [];
        dataList.forEach(function(f){
            if (f) {
                var info = fs.statSync(filedir + '/' + f);

                //console.log(info);

                if (info.mode == 33206) {
                    arr.push(filedir + '/' + f);
                }
            }
        });

        //讀取數組中的文件內容,併合並

        var content = '';
        arr.forEach(function(f) {
            var c = fs.readFileSync( f );
            //console.log(c);
            content += c.toString() + '\n';

        });

        console.log(content);

        fs.writeFile('./noedTest/js/index.js', content);
    });


});

使用node進行web開發

用戶瀏覽的簡單流程:

  • 1.用戶經過瀏覽器發送一個http的請求到指定的主機

  • 2.服務器接收到該請求,對該請求進行分析和處理

  • 3.服務器處理完成之後,返回對應的數據到用戶機器

  • 4.瀏覽器接收服務器返回的數據,並根據接收到的進行分析和處理
    *

  • 客戶端 服務端

  • 由客戶端發送一個http請求到指定的服務端 -> 服務端接收並處理請求 -> 返回數據到客戶端
    1.搭建一個http的服務器,用於處理用戶發送的http請求

須要使用node提供一個模塊 http


參考資料:

1.nodejs安裝及環境配置(windows系統)
2.win8怎樣打開命令提示符[cmd]
3.Node.js等安裝包出現2503錯誤的解決方法

相關文章
相關標籤/搜索