搭建靜態資源服務器之node HTTP
模塊
-
1. 代碼如下:
const http = require('http'); const ip = '192.168.1.108'; const port = 3608; http.createServer((req,res)=>{ res.writeHead(200,{'Content-Type':'text/html'}); res.write("<html>"); res.write("<head>"); res.write("</head>"); res.write("<body>"); res.write("<h1>hello nodejs world!</h1>"); res.write("</body>"); res.write("</html>"); res.end(); }).listen(port,ip,()=>{ console.log('server start'); });
- 先在linux輸入命令
顯示root@tecmint:~# node app.js
server start //表示已經啟動服務
- 在瀏覽器中輸入ip地址
192.168.1.108:3608 //顯示相對應的信息
- 先在linux輸入命令
- 封裝成函數
- 代碼如下:
const http = require('http'); const ip = '192.168.2.108'; const port = 3608; var fn = function(req,res){ res.writeHead(200,{'Content-Type': 'text/html'}); res.write("<html>"); res.write("<head>"); res.write("</head>"); res.write("<body>"); res.write("<h1>hello nodejs world!</h1>"); res.write("</body>"); res.write("</html>"); res.end(); } var fs = function(){ console.log('server start'); } http.createServer(fn).listen(port,ip,fs);
搭建靜態資源服務器之node URL
模塊
-
url.parse(urlStr[, parseQueryString][, slashesDenoteHost]);
- 說明: 將一個URL字符串轉換成對象并返回
- 參數:
- urlStr 表示url字符串
- parseQueryString 為true時將使用查詢模塊分析查詢字符串,默認為false
- slashesDenoteHost
默認為false,//foo/bar 形式的字符串將被解釋成 { pathname: ‘//foo/bar' }
如果設置成true,//foo/bar 形式的字符串將被解釋成 { host: ‘foo', pathname: ‘/bar' }
- 代碼如下:
const http = require('http'); const url = require('url'); const ip = '192.168.2.108'; const port = 3608; var fn = function(req,res){ var pathname = url.parse(req.url).pathname; res.write(pathname); res.end(); } var fs = function(){ console.log('server start'); } http.createServer(fn).listen(port,ip,fs);
搭建靜態資源服務器之node fs
模塊
-
Node.js 文件系統(fs 模塊)模塊中的方法均有異步和同步版本,例如讀取文件內容的函數有異步的 fs.readFile() 和同步的 fs.readFileSync()。
異步的方法函數最后一個參數為回調函數,回調函數的第一個參數包含了錯誤信息(error)。
建議大家是用異步方法,比起同步,異步方法性能更高,速度更快,而且沒有阻塞。
-
fs.readFile(file[, options], callback);
- 說明:
- 異步讀取文件。其中file可以為文件名或文件路徑,options可以為對象或字符串。包括讀取文件時的編碼、文件的讀取方式(默認為‘r’);
- fs.readFile(文件名,編碼,回調函數(err,data));
- 代碼如下:
var fs = require("fs"); // 異步讀取 fs.readFile('input.txt', function (err, data) { if (err) { return console.error(err); } console.log("異步讀取: " + data.toString()); }); // 同步讀取 var data = fs.readFileSync('input.txt'); console.log("同步讀取: " + data.toString()); console.log("程序執行完畢。");
- 說明:
nodejs文件操作模塊FS(File System)常用函數簡明總結
件系統操作相關的函數挺多的。首先可以分為兩大類。
一類是異步+回調的。 一類是同步的。
在這里只對異步的進行整理,同步的只需要在函數名稱后面加上Sync即可
-
1.1 首先是一類最常規的讀寫函數,函數名稱和形式,應該是起源于C語言的。
-
fs.open(path, flags[, mode], callback);
- 說明:異步模式下打開文件
- fs.open(文件路徑,讀寫標識,[文件mode值,666],回調函數(err,文件句柄fd));
- 參數:
- path - 文件的路徑。
- flags - 文件打開的行為。具體值詳見下文。
- mode - 設置文件模式(權限),文件創建默認權限為 0666(可讀,可寫)。
- callback - 回調函數,帶有兩個參數如:callback(err, fd)。
- 實例:
以上代碼執行結果如下:var fs = require("fs"); // 異步打開文件 console.log("準備打開文件!"); fs.open('input.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log("文件打開成功!"); });
$ node file.js 準備打開文件! 文件打開成功!
-
fs.read(fd, buffer, offset, length, position, callback);
說明:異步模式下讀取文件
fs.read(文件句柄fd,被寫入的buffer,offset,length,position,回調函數(err, bytesRead, buffer));
-
參數 :
- fd - 通過 fs.open() 方法返回的文件描述符。
- buffer - 數據寫入的緩沖區。
- offset - 緩沖區寫入的寫入偏移量。
- length - 要從文件中讀取的字節數。
- position - 文件讀取的起始位置,如果 position 的值為 null,則會從當前文件指針的位置讀取。
- callback - 回調函數,有三個參數err, bytesRead, buffer,err 為錯誤信息, bytesRead 表示讀取的字節數,buffer 為緩沖區對象。
其功能為從指定的文件描述符 fd 中讀取數據并寫入 buffer 指向的緩沖區對象。offset 是buffer 的寫入偏移量。length 是要從文件中讀取的字節數。position 是文件讀取的起始位置,如果 position 的值為 null,則會從當前文件指針的位置讀取。回調函數傳遞bytesRead 和 buffer,分別表示讀取的字節數和緩沖區對象。
- 實例:
```
var fs = require("fs");
var buf = new Buffer(1024);console.log("準備打開已存在的文件!");
fs.open('input.txt', 'r+', function(err, fd) {
if (err) {
return console.error(err);
}
console.log("文件打開成功!");
console.log("準備讀取文件:");
fs.read(fd, buf, 0, buf.length, 0, function(err, bytes){
if (err){
console.log(err);
}
console.log(bytes + " 字節被讀取");// 僅輸出讀取的字節 if(bytes > 0){ console.log(buf.slice(0, bytes).toString()); } });
});
以上代碼執行結果如下:
$ node file.js
準備打開已存在的文件!
文件打開成功!
準備讀取文件:
42 字節被讀取
百度:www.baidu.com
-
fs.write(文件句柄fd,被讀取的buffer,offset,length,position,回調函數(err,bytesWritten,buffer));
功能為將buffer內容寫入fd中。
+ fs.close(文件句柄,回調函數);
+ fs.truncate(文件句柄,截斷長度,回調函數);
+ fs.fsync(文件句柄,回調函數); 未完待續;
-
構建一個靜態資源的服務器,根據不同的url地址請求不同的文件(模板)
- 實例:
//加載http服務api模塊 var http = require('http'); var ip = '192.168.1.108'; //加載fs文件服務api模塊 var fs = require('fs'); //創建新的HTTP服務器 var server = new http.Server(); //創建url路由api模塊 var urlpai = require('url'); //監聽端口 server.listen(3068,ip); //使用on方法注冊事件處理,該事件一直被監聽。任何的請求都會進入回調函數,執行相應的操作 server.on("request",function(request,response){//當有request請求的時候觸發處理函數 //解析請求url var url = urlpai.parse(request.url); //監聽請求的網站,以當前腳本目錄為根目錄的url地址 //console.log(url.pathname); //特殊url會讓服務器在發送響應前先等待 switch(url.pathname){ case '' || '/'://處理請求的網站根目錄,指定加載對應的文件夾,一般以根目錄的index.html為默認,node.js是高效流處理的方案,也可以通過配置文件來配置 fs.readFile("./index.html",function(err,data){//打開請求文件 if(err){ //輸入錯誤信息,也可以自定義錯誤信息 response.writeHead(404,{'Content-Type':'text/plain;charset="UTF-8"'}); response.write(err.message); response.end(); }else{ //請求成功返回數據 response.writeHead(200,{'Content-Type':'text/html;charset="UTF-8"'}); //告訴響應頭文件,返回數據的類型 response.write(data);//返回的內容,有時候還會加上buter數據類型 response.end();//結束相應,不寫的話。會一直處于相應狀態,頁面不會顯示內容 } }); break; case '/list': //顯示商品列表頁 fs.readFile("./list.html",function(err,data){ if(err){ response.writeHead(400.{'Content-Type':'text/plain;charset="UTF-8"'}); response.write(err.message); response.end(); }else{ response.writeHead(200,'Content-Type':'text/html;charset="UTF-8"'); response.write(data); response.end(); } }); break; case '/detail': //商品詳情頁 fs.readFile("./detail.html",function(err,data){ if(err){ response.writeHead(400,{'Content-Type':'text/plain;charset="UTF-8"'}); response.write(err.message); response.end(); }else{ response.writeHead(200.{'Content-Type':'text/html;charset="UTF-8"'}); response.write(data); response.end(); } }); break; default: //處理來自本地目錄的文件,主要是一些靜態資源文件,搭建靜態服務器還有其他方法 var fileName = url.pathname.substring(1); //去掉前導'/' var types = getType(fileName.substring(fileName.lastIndexOf('.')+1)); console.log(fileName); //取得文件類型 css js .... //異步讀取文件,并將內容作為單獨的數據模塊傳給回調函數 //對于確實很大的文件,使用流API fs.createReadStream()更好 fs.readFile(fileName,function(err,data) { if(err){ response.writeHead(400,{'Content-Type':'text/plain;charset="UTF-8"'}); response.write(err.message); response.end(); }else{ response.writeHead(200,{'Content-Type':types}); response.write(data); response.end(); } }); break; } }); //判斷文件類型的函數 function getType(endTag){ var type = null; switch (endTag) { case 'html': type = 'text/html;charset=UTF-8'; break; case 'htm': type = 'text/html;charset=UTF-8'; break; case 'txt': type = 'text/plain;charset=UTF-8'; break; case 'css': type = 'text/css;charset=UTF-8'; break; case 'js': type = 'application/javascript;charset=UTF-8'; break; case 'manifest': type = 'text/cache-manifest;charset=UTF-8'; break; default: type = 'application/octet-stream'; } return type; }