文章連接: http模塊和fs模塊
http
模塊response
對象經常使用方法:html
response.writeHead(200,{'Content-Type':'text/plain:charset=UTF-8'});
此方法只能在消息上調用一次,而且必須在調用response.end()
以前調用。node
response.write()
發送一塊相應主體,用來給客戶端發送相應數據。write
可使用屢次,可是最後必定要使用end
來結束響應,不然客戶端會一直等待。response.end()
此方法向服務器發出信號,表示已發送全部響應頭和主體,該服務器應該視爲此消息完成。必須在每一個響應上調用方法response.end()
。const http = require('http'); http.createServer(function(req, res) { res.writeHead(200, {'Content-Type': 'text/html'}); res.write('hello world'); res.write('<h1>hello node.js</h1>'); res.end(); }).listen(8080); console.log('Server running at http://127.0.0.1:8080');
request
對象git
request.url
獲取請求路徑,獲取到的是端口號以後的那一部分路徑,也就是說全部的url
都是以/
開頭的,判斷路徑處理響應。request.socket.localAddress
獲取ip
地址。request.socket.remotePort
獲取源端口。const http = require('http'); let server = http.createServer(); server.on('request', function(req, res) { console.log('收到請求,請求路徑是:' + req.url); console.log('請求個人客戶端的地址是:', req.socket.remoteAddress, req.socket.remotePort); let url = req.url; res.writeHead(200, {'Content-Type': 'text/html;charset=UTF-8'}); switch (url) { case '/': res.end('<h1>Index page</h1>'); break; case '/login': res.end('<h1>Login page</h1>'); break; default: res.end('404 Not Found.'); break; } }); server.listen(8080, function() { console.log('服務器啓動成功,能夠訪問了。。。'); });
fs
模塊全部文件系統操做都具備同步和異步的形式。異步方法中回調的第一個參數老是留給異常參數,若是方法成功完成,那麼這個參數爲null
或undefined
。github
由於Node.js是單線程的,因此在Node.js中絕大部分須要在服務器運行期反覆執行業務邏輯的代碼,必須使用異步代碼,不然,同步代碼在執行期,服務器將中止響應。緩存
服務器啓動時若是須要讀取配置文件,或結束時須要寫入到狀態文件時,可使用同步代碼,由於這些代碼只在啓動和結束時執行一次,不影響服務器正常運行時的異步執行。服務器
打開文件異步
異步打開文件語法格式:fs.open(path,flags[mode],callback);
socket
參數說明:函數
path
:文件路徑。flags
:文件打開的行爲。mode
:設置文件模式(權限),文件建立默認權限爲0o666
(可讀寫)。callback
:回調函數,帶有兩個參數:callback(err,fd)
。flags
參數:性能
a
- 打開文件用於追加。若是文件不存在,則建立該文件。ax
- 與 a
類似,但若是路徑存在則失敗。a+
- 打開文件用於讀取和追加。若是文件不存在,則建立該文件。ax+
- 與 a+
類似,但若是路徑存在則失敗。as
- 以同步模式打開文件用於追加。若是文件不存在,則建立該文件。as+
- 以同步模式打開文件用於讀取和追加。若是文件不存在,則建立該文件。r
- 打開文件用於讀取。若是文件不存在,則會發生異常。r+
- 打開文件用於讀取和寫入。若是文件不存在,則會發生異常。rs+
- 以同步模式打開文件用於讀取和寫入。指示操做系統繞開本地文件系統緩存。這對於在 NFS
掛載上打開文件很是有用,由於它容許跳過可能過期的本地緩存。 它對 I/O
性能有很是實際的影響,所以除非須要,不然不建議使用此標誌。這不會將 fs.open()
或 fsPromises.open()
轉換爲同步的阻塞調用。 若是須要同步操做,則應使用 fs.openSync()
之類的操做。w
- 打開文件用於寫入。建立文件(若是它不存在)或截斷文件(若是存在)。wx
- 與 w
類似,但若是路徑存在則失敗。w+
- 打開文件用於讀取和寫入。建立文件(若是它不存在)或截斷文件(若是存在)。wx+
- 與 w+
類似,但若是路徑存在則失敗。const fs = require('fs'); fs.open('file/syl.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log('文件打開成功!'); });
關閉文件
異步打開文件語法格式:fs.close(fs,callback);
const fs = require('fs'); fs.open('file/syl.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log('文件打開成功!'); fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件關閉成功'); }); });
fs.read
和fs.write
讀寫文件使用fs.read
和fs.write
讀寫文件須要使用fs.open
打開文件和fs.close
關閉文件。
使用fs.read
讀取文件
異步讀取文件的語法格式:fs.read(fs,buffer,offset,length,position,callback)
參數:
fd
:經過fs.open()
方法返回的文件描述符。buffer
:數據寫入的緩衝區。offset
:緩衝區中開始寫入的偏移量。length
:一個整數,指定要讀取的字節數。position
:指定從文件中開始讀取的位置。若是position
爲null
,則從當前文件位置讀取數據,並更新文件位置。callback
:回調函數,有三個參數err
、bytesRead
、buffer
。const fs = require('fs'); fs.open('file/syl.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log('文件打開成功!'); console.log('準備讀取文件:'); // 建立一個大小爲1024字節的緩存區 let buf = Buffer.alloc(1024); // 異步讀取文件 fs.read(fd, buf, 0, buf.length, 0, function(err, bytes, buf) { if (err) { console.log(err); } console.log(bytes + '字節被讀取'); if (bytes > 0) { console.log(buf.slice(0, bytes).toString()); } fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件關閉成功'); }); }); }); // 文件打開成功! // 準備讀取文件: // 5字節被讀取 // Hello // 文件關閉成功
使用fs.write
寫入文件
異步寫入文件的語法格式:fs.write(fd,buffer,offset,length,position,callback);
const fs = require('fs'); fs.open('file/syl.txt', 'a', function(err, fd) { if (err) { return console.error(err); } console.log('文件打開成功!'); console.log('準備寫入文件:'); let buf = Buffer.from(new String('Hello World')); fs.write(fd, buf, 0, 11, 0, function(err, bytes, buf) { if (err) { console.log(err); } console.log('寫入成功'); console.log(bytes + '字節被寫入'); console.log(buf.slice(0, bytes).toString()); fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件關閉成功'); }); }); }); // 文件打開成功! // 準備寫入文件: // 寫入成功 // 11字節被寫入 // Hello World // 文件關閉成功
另一種語法:fs.write(fd,string,position,encoding,callback);
const fs = require('fs'); fs.open('file/syl.txt', 'a', function(err, fd) { if (err) { return console.error(err); } console.log('文件打開成功!'); console.log('準備寫入文件:'); let data = ',Hello Node.js'; fs.write(fd, data, 0, 'utf-8', function(err, bytes, buffer) { if (err) { console.log(err); } console.log(bytes + '字節被寫入'); console.log(buffer); fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件關閉成功'); }); }); }); // 文件打開成功! // 準備寫入文件: // 14字節被寫入 // ,Hello Node.js // 文件關閉成功
fs.read
和fs.write
須要結合fs.open
獲得文件句柄來使用。
readFile
讀取文件語法格式:fs.readFile(path,[options],callback);
參數:
path
:文件明或文件描述符。options
:該參數是一個對象,包含{encoding,flag}
。encoding
默認值爲null
,flag
默認值爲r
。第一種方式:
const fs = require('fs'); fs.readFile('file/syl.txt', 'utf-8', function(err, data) { if (err) { throw err; } console.log(data); });
第二種方式:
fs.readFile('file/syl.txt', function(err, data) { if (err) { throw err; } console.log(data.toString()); });
writeFile
寫入文件語法格式:fs.writeFile(file,data,[options],callback);
const fs = require('fs'); fs.writeFile('file/syl.txt', '我是新寫入的內容', function(err) { if (err) { throw err; } console.log('已保存'); fs.readFile('file/syl.txt', 'utf-8', function(err, data) { if (err) { throw err; } console.log(data); }); }); // 已保存 // 我是新寫入的內容
咱們能夠經過設置flag
的值,來改變默認的寫入方式,好比設置爲a
追加數據到文件中。
fs.writeFile('file/syl.txt', '我是新寫入的內容', {'flag': 'a'}, function(err) { if (err) { throw err; } console.log('已保存'); fs.readFile('file/syl.txt', 'utf-8', function(err, data) { if (err) { throw err; } console.log(data); }); });
語法格式:fs.stat(path,callback);
不建議在調用fs.open()
、fs.readFile()
或fs.writeFile()
以前使用fs.stat()
檢查文件是否存在。而是應該直接打開、讀取或寫入文件,並在文件不可用時處理引起的錯誤。
fs.stat(path)
執行後,會將stats
類的實例返回給其回調函數。能夠經過stats
類中的提供方法判斷文件的相關屬性。
const fs = require('fs'); fs.stat('file/syl.txt', function(err, stats) { console.log(stats.isFile()); }); // true
語法格式:fs.ftruncate(fd,len,callback);
const fs = require('fs'); fs.open('file/syl.txt', 'r+', function(err, fd) { if (err) { return console.error(err); } console.log('文件打開成功'); console.log('截取6字節內的文件內容,超出部分將被去除。'); // 截取文件 let buf = Buffer.alloc(1024); fs.ftruncate(fd, 6, function(err) { if (err) { console.log(err); } console.log('文件截取成功。'); console.log('讀取相同的文件'); fs.read(fd, buf, 0, buf.length, 0, function(err, bytes) { if (err) { console.log(err); } if (bytes > 0) { console.log(buf.slice(0, bytes).toString()); } fs.close(fd, function(err) { if (err) { console.log(err); } console.log('文件關閉成功!'); }); }); }); });
fs.unlink('file/syl.txt', function(err) { if (err) { return console.error(err); } console.log('文件刪除成功!'); });
語法格式:fs.rename(oldPath,newPath,callback);
fs.rename('file/old.txt', 'file/new.txt', err => { if (err) throw err; console.log('重命名完成'); });
新建目錄
語法格式:fs.mkdir(path,callback);
fs.mkdir('./test/', function(err) { if (err) { return console.error(err); } console.log('目錄建立成功。'); });
讀取目錄
語法格式:fs.readdir(path,callback);
fs.readdir('./test', function(err, files) { if (err) { throw err; } console.log(files); });
刪除目錄
語法格式:fs.rmdir(path,callback);
只能刪除空目錄。
fs.rmdir('./test', function(err) { if (err) { return console.error(err); } });