node.js學習筆記整理(一)

来源:https://www.cnblogs.com/fangnianqin/archive/2018/12/26/10174648.html
-Advertisement-
Play Games

(1)node Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。 Node與javaScript的區別在於,javaScript的頂層對象是window,而node是global 模塊:在node中,文件和模塊是一一對應的,也就是一個文件就是一個模塊;每個模塊 ...


(1)node

Node.js 是一個基於 Chrome V8 引擎的 JavaScript 運行環境。
Node與javaScript的區別在於,javaScript的頂層對象是window,而node是global

//這裡使用的var聲明的變數不是全局的,是當前模塊下的,用global聲明的表示是全局的
var s = 100;
global.s = 200;
//這裡訪問到的s是var生命的
console.log(s); //100
//這裡訪問到的才是全局變數
console.log(global.s); //200

模塊:在node中,文件和模塊是一一對應的,也就是一個文件就是一個模塊;每個模塊都有自己的作用域,我們通過var申明的變數並非全局而是該模塊作用域下的。

(2)module模塊

1、文件查找

1)首先按照載入的模塊的文件名稱進行查找,如果沒有找到,則會帶上 .js、.json 或 .node 拓展名在載入
2)以 '/' 為首碼的模塊是文件的絕對路徑。 例如,require('/home/marco/foo.js') 會載入 /home/marco/foo.js 文件。
3)以 './' 為首碼的模塊是相對於調用 require() 的文件的。 也就是說,circle.js 必須和 foo.js 在同一目錄下以便於 require('./circle') 找到它。
4)當沒有以 '/'、'./' 或 '../' 開頭來表示文件時,這個模塊必須是一個核心模塊或載入自 node_modules 目錄。
5)如果給定的路徑不存在,則 require() 會拋出一個 code 屬性為 'MODULE_NOT_FOUND' 的 Error。

2、module 作用域

在一個模塊中通過var定義的變數,其作用域範圍是當前模塊,外部不能夠直接的訪問,如果我們想一個模塊能夠訪問另外一個模塊中定義的變數,可以有一下兩種方式:
1)把變數作為global對象的一個屬性,但這樣的做法是不推薦的
2)使用模塊對象 module。module保存提供和當前模塊有關的一些信息。
在這個module對象中有一個子對象exports對象,我們可以通過這個對象把一個模塊中的局部變數對象進行提供訪問。

//這個方法的返回值,其實就是被載入模塊中的module.exports
require('./02.js');

3、__dirname:當前模塊的目錄名。

例子,在 /Users/mjr 目錄下運行 node example.js:
console.log(__dirname);
// 輸出: /Users/mjr
console.log(path.dirname(__filename));
// 輸出: /Users/mjr

4、__filename:當前模塊的文件名(處理後的絕對路徑)。當前模塊的目錄名可以使用 __dirname 獲取。

在 /Users/mjr 目錄下運行 node example.js:

console.log(__filename);
// 輸出: /Users/mjr/example.js
console.log(__dirname);
// 輸出: /Users/mjr

(3)process(進程)

process 對象是一個全局變數,提供 Node.js 進程的有關信息以及控制進程。 因為是全局變數,所以無需使用 require()。

1、process.argv

返回進程啟動時的命令行參數。第一個元素是process.execPath。第二個元素是當前執行的JavaScript文件的路徑。剩餘的元素都是額外的命令行參數。

console.log(process.argv);

列印結果:

2、process.execPath返回啟動進程的可執行文件的絕對路徑。

3、process.env 返回用戶的環境信息。

在process.env中可以新增屬性:

process.env.foo = 'bar';
console.log(process.env.foo);

可以通過delete刪除屬性:

delete process.env.foo;
console.log(process.env);

在Windows上,環境變數不區分大小寫

4、process.pid 屬性返回進程的PID。

5、process.platform屬性返回字元串,標識Node.js進程運行其上的操作系統平臺。

6、process.title 屬性用於獲取或設置當前進程在 ps 命令中顯示的進程名字

7、process.uptime() 方法返回當前 Node.js 進程運行時間秒長

註意: 該返回值包含秒的分數。 使用 Math.floor() 來得到整秒鐘。

8、process.versions屬性返回一個對象,此對象列出了Node.js和其依賴的版本信息。

process.versions.modules表明瞭當前ABI版本,此版本會隨著一個C++API變化而增加。 Node.js會拒絕載入模塊,如果這些模塊使用一個不同ABI版本的模塊進行編譯。

9、process對象-輸入輸出流


var a;
var b;
process.stdout.write('請輸入a的值: ');
process.stdin.on('data', (chunk) => {
    if (!a) {
        a = Number(chunk);
        process.stdout.write('請輸入b的值:');
    }else{
        b = Number(chunk);
        process.stdout.write('a+b的值:'+(a+b));
        process.exit();
    }
});

(4)Buffer緩衝器

Buffer類,一個用於更好的操作二進位數據的類,我們在操作文件或者網路數據的時候,其實操作的就是二進位數據流,Node為我們提供了一個更加方便的去操作這種數據流的類Buffer,他是一個全局的類

1、如何創建使用buffer

Buffer.from(array) 返回一個 Buffer,包含傳入的位元組數組的拷貝。
Buffer.from(arrayBuffer[, byteOffset [, length]]) 返回一個 Buffer,與傳入的 ArrayBuffer 共用記憶體。
Buffer.from(buffer) 返回一個 Buffer,包含傳入的 Buffer 的內容的拷貝。
Buffer.from(string[, encoding]) 返回一個 Buffer,包含傳入的字元串的拷貝。
Buffer.alloc(size[, fill[, encoding]]) 返回一個指定大小且已初始化的 Buffer。 該方法比 Buffer.allocUnsafe(size) 慢,但能確保新創建的 Buffer 不會包含舊數據。
Buffer.allocUnsafe(size) 與 Buffer.allocUnsafeSlow(size) 返回一個指定大小但未初始化的 Buffer。 因為 Buffer 是未初始化的,可能包含舊數據。

// 創建一個長度為 10、且用 01 填充的 Buffer。
const buf1 = Buffer.alloc(10,1);
// 創建一個長度為 10、且未初始化的 Buffer。
// 這個方法比調用 Buffer.alloc() 更快,但返回的 Buffer 實例可能包含舊數據,因此需要使用 fill() 或 write() 重寫。
const buf2 = Buffer.allocUnsafe(10);
const buf3 = Buffer.from([1, 2, 3]);
const buf4 = Buffer.from('tést');
console.log(buf1); //<Buffer 01 01 01 01 01 01 01 01 01 01>
console.log(buf2); //<Buffer 00 00 00 00 08 00 00 00 07 00>
console.log(buf3); //<Buffer 01 02 03>
console.log(buf4); //<Buffer 74 c3 a9 73 74>

2、Buffer對象提供的toString、JSON的使用

1)buf.toString(encoding,start,end)

var bf = Buffer.from('miaov');
console.log(bf.toString('utf-8',1,4)); //iaov
console.log(bf.toString('utf-8',0,5)); //miaov
console.log(bf.toString('utf-8',0,6)); //miaov

2)buf.write(string,offset,length,encoding)
string 要寫入 buf 的字元串。
offset 開始寫入的偏移量。預設 0,這裡指的是buffer對象的起始要寫入的位置。
length 要寫入的位元組數。預設為 buf.length - offset。
encoding string 的字元編碼。預設為 'utf8'。
返回: 已寫入的位元組數。

var str = "miaov hello";
var bf = Buffer.from(str);
var bf2 = Buffer.alloc(8);
//從0開始寫入5個
bf2.write(str,0,5);
console.log(bf);
console.log(bf2);

3)buf.toJSON()

const buf = Buffer.from([0x1, 0x2, 0x3, 0x4, 0x5]);
const json = JSON.stringify(buf);

console.log(json);
// 輸出: {"type":"Buffer","data":[1,2,3,4,5]}

3、Buffer中靜態方法的使用

1)Buffer.isEncoding(encoding) : 判斷是否是Buffer支持的字元編碼,是則返回true,不是則返回false

console.log(Buffer.isEncoding('utf-8')); //true

2)Buffer.isBuffer(obj) :如果 obj 是一個 Buffer,則返回 true,否則返回 false。

(5)fs(文件系統)

該模塊是核心模塊,需要使用require('fs')導入後使用,該模塊主要用來操作文件

1、fs.open(path, flags, mode, callback)
path:要打開的文件的路徑;
flags:打開文件的方式 讀/寫;
mode:設置文件的模式 讀/寫/執行
callback(err,fd):文件打開以後,在回調函數中做相應的處理,回調函數的兩個參數:
err:文件打開失敗的錯誤保存在err裡面,如果成功err為null
fd:被打開文件的標識

var fs = require('fs');
fs.open('./test.txt','r',function(err,fd){
  if(err){
        console.log("文件打開失敗");
    }else{
        console.log("文件打開成功");
    }
});

2、fs.openSync(path, flags, mode) :返迴文件描述符。

var fs = require('fs');
console.log(fs.openSync('./test.txt','r')); //3

3、fs.read(fd, buffer, offset, length, position, callback)
從 fd 指定的文件中讀取數據;
buffer 指定要寫入數據的 buffer;
offset 指定 buffer 中開始寫入的偏移量;
length 指定要讀取的位元組數;
position 指定文件中開始讀取的偏移量。 如果 position 為 null,則從文件的當前位置開始讀取;
callback 有三個參數 (err, bytesRead, buffer)

示例:test.txt 中的值為123456789

fs.open('./test.txt','r',function(err,fd){
    if(!err){
        var bf = Buffer.alloc(5);
        fs.read(fd,bf,0,5,0,function(){
            console.log(bf.toString()); //12345
        })
    }
});

4、fs.write(fd, buffer, offset, length, position, callback)
將 buffer 寫入到 fd 指定的文件。
offset 指定 buffer 中要開始被寫入的偏移量,length 指定要寫入的位元組數。
position 指定文件中要開始寫入的偏移量。 如果 typeof position !== 'number',則從當前位置開始寫入。
callback 有三個參數 (err, bytesWritten, buffer),其中 bytesWritten 指定 buffer 中已寫入文件的位元組數。

var fs = require('fs');

fs.open('./test.txt','r+',function(err,fd){
    if(!err){
        var bf = Buffer.alloc(5);
        fs.read(fd,bf,0,5,0,function(){
            console.log(bf.toString()); //12345
        });
        var bf = Buffer.from('test數據');
        fs.write(fd,bf,0,10,0);
        fs.write(fd,'測試數據2',10,'utf-8');

    }
});

fs.write(fd, string, position, encoding, callback)
將 string 寫入到 fd 指定的文件。 如果 string 不是一個字元串,則會強制轉換成字元串。
position 指定文件中要開始寫入的偏移量。 如果 typeof position !== 'number',則從當前位置開始寫入。
encoding 指定字元串的編碼。
callback 有三個參數 (err, written, string),其中 written 指定字元串中已寫入文件的位元組數。 寫入的位元組數與字元串的字元數是不同的。

5、fs.exists(path,callback)檢查指定路徑的文件或者目錄是否存在
fs.appendFile(path, data, callback):將數據追加到文件,如果文件不存在則創建文件。

//檢查文件是否存在
var fs = require('fs');
var filename = './test2.txt';
fs.exists(filename,function(isExists){
        if(!isExists){
            fs.writeFile(filename,'miaov',function(err){
                if(err){
                    console.log("文件創建失敗");
                }else{
                    console.log("文件創建成功");
                }
            });
        }else{
            fs.appendFile(filename,'-leo',function(err){
                if(err){
                    console.log("文件內容追加失敗");
                }else{
                    console.log("文件內容追加成功");
                }
            })
        }
});

(6)前端項目自動化構建

1、創建myProject項目文件以及對應的文件夾

var projectData ={
    'name':'myProject',
    '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.length){
        fileData.forEach(function(file){
             //文件或文件夾路徑
             file.path = './'+projectData.name +'/'+ file.name;
             //根據type類型創建文件或文件夾
             file.content = file.content || '';

             switch(file.type){
                 case 'dir':
                     fs.mkdirSync(file.path);
                     break;

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

        });
    }

}

2、自動打包多個文件

var fs = require('fs');
var filedir = './myProject/dist';

fs.exists(filedir,function(isExists){
    if(!isExists){
       fs.mkdirSync(filedir);
    }
    fs.watch(filedir,function(ev,file){
        //只要有一個文件發生了變化,我們就需要對文件夾下的所有文件進行讀取、合併
        fs.readdir(filedir,function(err,dataList){
            var arr = [];
            dataList.forEach(function(file){
                if(file){
                    //statSync查看文件屬性
                    var info = fs.statSync(filedir + '/' +file);
                    //mode文件許可權
                    if(info.mode === 33206){
                        arr.push(filedir + '/' +file);
                    }
                }
            });
            //讀取數組中的文件內容
            var content = '';
            arr.forEach(function(file){
                var c = fs.readFileSync(file);
                content += c.toString()+'\n';
            });
           //合併文件中的內容
           fs.writeFileSync('./myProject/js/index.js',content);

        })

    });
});

(7)使用node進行web開發

1、搭建一個http的伺服器,用於處理用戶發送的http請求

//載入一個http模塊
var http = require('http');
//通過http模塊下的createServer創建並返回一個web伺服器對象
var server = http.createServer();
//開啟 HTTP 伺服器監聽連接,只有調用了listen方法以後,伺服器才開始工作
server.listen(8000,'localhost');
//伺服器是否正在監聽連接
server.on('listening',function(){
    console.log("listening..........");
});
//每次接收到一個請求時觸發,每個連接可能有多個請求(在 HTTP keep-alive 連接的情況下)。
server.on('request',function(){
     res.write('<p>hello</p>');
     res.end();
});

2、request方法有兩個參數:request、response

1)request:http.IncomingMessage的一個實例,獲取請求的一些信息,如頭信息,數據等
httpVession:使用的http協議的版本
headers:請求頭信息中的數據
url:請求的地址
method:請求的方式

2)response:http.ServerResponse的一個實例,可以向請求的客戶端輸出返迴響應
write(chunk,encoding):發送一個數據塊到相應正文中
end(chunk,encoding):當所有的正文和頭信息發送完成以後調用該方法告訴伺服器數據已經全部發送完成了,這個方法在每次完成信息發送以後必須調用,並且是最後調用。
statusCode:該屬性用來設置返回的狀態碼
setHeader(name,value):設置返回頭信息
writeHead(statusCode,reasonPhrase,headers)這個方法只能在當前請求中使用一次,並且必須在response.end()之前調用

3、使用fs模塊實現行為表現分離

var http = require('http');
var url = require('url');
var fs = require('fs');

var server = http.createServer();
//html文件的路徑
var htmlDir = __dirname + '/html/';
server.on('request',function(request,response){
    var urlStr = url.parse(request.url);
    //根據pathname匹配對應的html文件
    switch(urlStr.pathname){
        case '/':
            sendData(htmlDir + 'index.html',request,response);
            break;
        case '/user':
            sendData(htmlDir + 'user.html',request,response);
            break;
        case '/login':
            sendData(htmlDir + 'login.html',request,response);
            break;
        default:
            //處理其他情況
            sendData(htmlDir + 'err.html',request,response );
            break;
    }
});

function sendData(file,request,response){
    //讀取文件,存在則返回對應讀取的內容,不存在則返回錯誤信息
    fs.readFile(file,function(err,data){
        if(err){
            response.writeHead(404,{
                'content-type':'text/html;charset=utf-8'
            });
            response.end('<h1>頁面不存在</h1>')
        }else{
            response.writeHead(200,{
                'content-type':'text/html;charset=utf-8'
            });
            response.end(data);
        }
    })
}
server.listen(8000,'localhost');

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.getter與setter javascript的大部分東西是簡化了的。這裡我們假設有一個student對象,並且我們用student.age來訪問它的age屬性,如果此時定義了age屬性,我們就會得到它 的值,如果沒有,我們就會得到undefined。 但是我們也可以編寫自定義的getter和 ...
  • 在初步完成了 "線上流程圖編輯工具" 之後,又接到了線上搭建頁面工具的需求,剛開始其實並不想接項目,因為從歷史以及現實原因來看,個性化及動態渲染都是很難解決的痛點,各種H5頁面搭建工具的不溫不火早已說明瞭這條路並沒有這麼好走,但從另一個方面來說,既然有了這樣的需求,那也就說明瞭現實的工作流程確實存在 ...
  • 頁面中經常會用到各式各樣的輪播圖,今天賀賀為大家介紹一種常用的方法,對於JS我們需要舉一反三,一種方法可以對多個輪播樣式進行渲染。 此種方法通過 JS 來改變 HTML 中標簽的 Class 名稱,從而達到輪播圖的效果; ...
  • 本文由雲+社區發表 絕大多數程式只考慮了介面正常工作的場景,而用戶在使用我們的產品時遇到的各類異常,全都丟在看似 ok 的 try catch 中。如果沒有做好異常的相容和兜底處理,會極大的影響用戶體驗,嚴重的還會帶來安全和資損風險。 介面異常,通常可以分為以下三類: CGI 邏輯出錯。 如調用方入 ...
  • 力軟web快速開發平臺是一款全開源的軟體平臺,為客戶提供集管理咨詢、軟體開發、系統維護為一體的綜合性服務。力軟web快速開發平臺使用了當前最主流開發技術,使web應用的開發更快捷和簡單。 作為一款高效的web開發工具,力軟web包含了眾多的功能組件。 工作流引擎、自定義表單、自定義報表、代碼生成器、 ...
  • js keyup、keypress和keydown事件都是有關於鍵盤的事件 當一個按鍵被pressed 或released在每一個現代瀏覽器中,都可能有三種客戶端事件。 keydown事件發生在鍵盤的鍵被按下的時候,接下來觸發keypress事件。 keyup 事件在按鍵被釋放的時候觸發。 這三個事 ...
  • 顧名思義 用箭頭 “ => ” 定義函數,如果箭頭函數的代碼塊部分有多條語句,就要使用大括弧將它們括起來,並且使用return返回。由於花括弧{ }被解釋為代碼塊,所以如果箭頭函數直接返回一個對象,必須在對象外面加上花括弧,否則會報錯。 ...
  • forEach函數用得平時用得比較多,但是從來沒想到forEach函數還有第二個參數。 這裡是菜鳥教程對forEach函數的詳細說明:forEach的詳細說明。 如上圖,forEach函數有第二個參數 thisValue。 簡單點來說,就是我們可以直接使用第二個參數來指定函數里的this的值,而不需 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...