Node.js 入门
Node.js是一個基于chrom V8引擎的一個JavaScript的運行環境。它可以用來開發后端程序。
Node.js像瀏覽器一樣,也內置有一些API,這些api中最主要的有 fs模塊、path模塊、http模塊三大模塊。
一、fs模塊
1. fs.readfile() 讀取指定文件中的內容
fs.readfile() 語法格式:
fs.readfile( path[, options], callback)
參數1:必選,字符串,表示文件的路徑;
參數2:可選,表示以什么編碼格式來讀取文件,一般是utf8;
參數3:必選,文件讀取完成后,通過回調函數拿到讀取的結果。回調函數參數(err, dataStr)
代碼示例:
// 1.導入fs模塊 const fs = require('fs')// 2.調用fs.readfile()方法讀取文件 fs.readFile('./1.txt','utf8', function(err,dataStr){// 2.1 打印失敗的結果// 如果讀取成功,err為null// 如果讀取失敗,err為 錯誤對象, dataStr的值為 undefinedconsole.log(err)console.log('------')// 2.2 打印成功的結果console.log(dataStr) })?2. fs.writeFile() 向指定文件寫入內容
語法格式:
fs.readfile( path, data[, options], callback)
參數1:必選,字符串,表示文件的路徑,如果該文件不存在,就會創建一個新文件;
參數2:必選,表示要寫入的內容,此行為會覆蓋文件之前的內容;
參數3:可選,表示以什么編碼格式寫入文件內容,一般是utf8;
參數4:必選,文件寫入完成后的回調函數。
代碼示例:
// 1.導入fs模塊 const fs = require('fs'); // 2.調用 fs.writeFile() 方法 fs.writeFile('2.txt', 'abcd', function(err){// 如果寫入成功,err 值為 null// 如果寫入失敗,err 值為 一個錯誤對象console.log(err); }) // 3.查看文件內容 fs.readFile('2.txt', 'utf8',function(err, dataStr){console.log(err); // nullconsole.log(dataStr); // abcd })3. 小小案例
????????將‘小紅=88 小明=90 狗蛋=75 二愣子=65 小王=98’,成績整理成'小紅:88', '小明:90', '狗蛋:75', '二愣子:65', '小王:98',并換行輸出.
// 1.導入fs模塊 const fs = require('fs'); // 2.讀取文件內容 fs.readFile('3.txt', 'utf8', (err, dataStr)=>{// 3.判斷是否讀取成功if(err){return console.log('讀取文件失敗' + err.message);}// console.log('讀取文件成功' + dataStr); 小紅=88 小明=90 狗蛋=75 二愣子=65 小王=98// 4.處理數據let newArr = [];let arr = dataStr.split(' ');for(let i=0;i<arr.length;i++){newArr[i] = arr[i].replace('=',':');}let str = newArr.join('\r\n');// 5.寫入內容fs.writeFile('4.txt', str, (err)=>{if(err){console.log('寫入失敗'+err.message);}console.log('寫入成功');}) })3. fs模塊-路徑動態拼接問題
在使用fs模塊操作文件時,如果提供的路徑是以./ ../ 開頭的相對路徑,很容易出現路徑動態拼接錯誤的問題。
原因:代碼在運行的時候,會以執行node命令所處的目錄,動態拼接出被操作文件的完整目錄。
?如上圖,被操作文件的目錄是當前node命令執行目錄與js文件中路徑拼接而成。
解決方法:將js文件中的路徑改為絕對路徑就可以了。
const fs = require('fs')、 // 換成絕對路徑 注意轉義 fs.readFile('C:\\Users\\legion\\Desktop\\file\\1.txt','utf8', function(err,dataStr){console.log(dataStr) })上面方法雖然可以解決問題,但是代碼可移植性差,難以維護。
node提供了一個 __dirname 表示當前文件所處路徑
const fs = require('fs')、 // 換成絕對路徑 注意轉義 fs.readFile(__dirname + '/1.txt','utf8', function(err,dataStr){console.log(dataStr) })可以使用__dirname 拼接被操作文件相對路徑,解決這個問題。
二、path模塊
1. path.join()方法
此方法可以將多個路徑片段,拼接為完整的路徑字符串。
const path = require('path'); // ../ 會抵消前面的一層路徑 const pathStr = path.join('/a', '/b/c', '../', '/d', 'e'); console.log(pathStr); // \a\b\d\e以后凡是涉及到路徑拼接的問題,都要使用path.join()方法進行處理,盡量不要使用 + 進行字符串拼接。
2. path.basename()方法
此方法可以從一個文件路徑中,獲取到文件的名稱。
這個方法可以有第二個參數,表示該文件的擴展名,加上之后,輸出的就只有文件的名字。
const path = require('path'); const fpath = 'c:/a/b/c/index.html'; console.log(path.basename(fpath)); // index.html // 這個方法可以有第二個參數,表示該文件的擴展名,加上之后,輸出的就只有文件的名字 console.log(path.basename(fpath, '.html')); // index3. path.extname()方法
此方法可以從一個文件路徑中,獲取到文件擴展名。
const path = require('path'); const fpath = 'c:/user/legion/a/b/index.html'; console.log(path.extname(fpath)); // .html4. 綜合案例
? ? ? ? 將一個html 文件中的 css,js,html 分離出來并分別放到新文件中。
const fs = require('fs'); const path = require('path');// 1.定義正則表達式 const regStyle = /<style>[\s\S]*<\/style>/; const regScript = /<script>[\s\S]*<\/script>/; // 2.讀取文件 fs.readFile(path.join(__dirname, '點名器.html'), 'utf8', (err, dataStr)=>{if(err){return console.log('文件讀取失敗');}// 3.拆解 css,js,html 文件resolveCSS(dataStr);resolveJS(dataStr);resolveHTML(dataStr); })// 定義分解css 方法 function resolveCSS(htmlStr){const r1 = regStyle.exec(htmlStr);// 替換字符串中的一些內容const newCSS = r1[0].replace('<style>', '').replace('</style>', ''); // 寫入 CSS 文件中fs.writeFile(path.join(__dirname, 'index.css'), newCSS, (err)=>{if(err){console.log('寫入css失敗');}console.log('寫入css成功');}) } // 定義分解js 方法 function resolveJS(htmlStr){const r2 = regScript.exec(htmlStr);const newJS = r2[0].replace('<script>', '').replace('</script>', '');fs.writeFile(path.join(__dirname, 'index.js'), newJS, (err)=>{if(err) console.log('寫入js失敗');console.log('寫入js成功');}) } // 定義分解HTML 方法 function resolveHTML(htmlStr){const newHTML = htmlStr.replace(regStyle, '<link rel="stylesheet" href="index.css">').replace(regScript, '<script src="index.js"></script>');fs.writeFile(path.join(__dirname,'index.html'), newHTML, (err)=>{if(err) console.log('寫入html失敗');console.log('寫入html成功');}) }三、http模塊
服務器與普通電腦的區別就是,服務器上安裝了服務器軟件,比如IIS、Apache等,通過安裝服務器軟件,就可以將一臺普通電腦變成一臺服務器。
node中,我們不需要安裝服務器軟件,可以使用http模塊構建一個web服務器。
1. 創建一個基本的 web 服務器
// 1. 導入http 模塊 const http = require('http') // 2. 創建 web 服務器實例 const server = http.createServer() // 3. 為服務器實例綁定 request 事件,監聽客戶端的請求 server.on('request', (req, res) => {console.log('Someone vist out web server.') }) // 4. 啟動服務器 server.listen(8080, () => {console.log('server running at http://127.0.0.1:8080') })2. req 請求對象
只要服務器接收到了服務器的請求,就會通過調用server.on() 為服務器綁定的 request 事件處理函數。如果想在事件處理函數中,訪問與客戶端相關的數據或屬性,可以使用如下的方式:
const http = require('http') const server = http.createServer() // req 是請求對象,包含了與客戶端相關的數據和屬性 server.on('request', (req) => {// req.url 是客戶端請求的 URL 地址const url = req.url;// req.method 是客戶端請求的 method 類型const method = req.method;const str = `正在請求的url是 ${url},請求方式是${method}`;console.log(str); }) server.listen(80, () => {// 如果端口號是80 服務器網址端口號就可以省略console.log('server running at http://127.0.0.1') })3. res 響應對象
在服務器的request 事件處理函數中,如果想訪問與服務器相關的數據或屬性,可以使用如下的方法:
server.on('request', (req, res) => {// req.url 是客戶端請求的 URL 地址const url = req.url;// req.method 是客戶端請求的 method 類型const method = req.method;const str = `Your request url is ${url}, and request method is ${method}.`;const str2 = `你正在請求的url是${url},請求的方式是${method}。`;// 調用 res.setHeader() 方法,設置 Content-Type 響應頭,解決中文亂碼問題res.setHeader('Content-Type', 'text/html; charset=utf-8');// 調用 res.end() 方法,向客戶端響應一些內容res.end(str + str2); })如果響應的數據中包含中文,就會出現中文亂碼的問題,解決這個問題,可以調用 res.setHeader() 方法,設置 Content-Type 響應頭。
res.setHeader('Content-Type', 'text/html; charset=utf-8');
4. 根據不同的url,響應不同的html
const http = require('http') const server = http.createServer() server.on('request', (req, res) => {// 1. 獲取請求的 url 地址let url = req.urllet content = '<h1>404 Not found!</h1>'// 2.判斷用戶請求的是否為 / 或 /index.html 首頁 /about.html 關于頁面if(url === '/' || url == '/index.html'){content = '<h1>首頁</h1>'} else if(url == '/about.html'){content = '<h1>關于頁面</h1>'}// 3. 設置 Content-Type 響應頭,防止中文亂碼res.setHeader('Content-Type', 'text/html; charset=utf-8')// 4. 使用 res.end() 把響應內容給客戶端res.end(content) }) server.listen(8080, () => {console.log('server running at http://127.0.0.1:8080') })5. 總和案例
? ? ? ? 創建一個服務器,響應客戶端請求的資源,我們的電腦既是客戶端也是服務器。
const fs = require('fs') const http = require('http') const path = require('path') const server = http.createServer() server.on('request', (req, res) => {// 1. 獲取 客戶端請求的 URLconst url = req.url;// 2. 把請求的 URL 地址映射為具體文件的存放路徑let fpath = '';// 2.1 如果客戶端請求的url 為 / 默認訪問首頁if(url === '/'){fpath = path.join(__dirname, './index/index.html')}else {// 2.2 優化用戶請求資源路徑fpath = path.join(__dirname, '/index', url)}// 3. 根據映射過來的路徑讀取文件內容fs.readFile(fpath, 'utf8', (err, dataStr) => {// 3.1 讀取失敗if(err) return res.end('404 Not found.')res.end(dataStr)}) }) server.listen(8080, () => {console.log('server running at http://127.0.0.1:8080') })?
總結
以上是生活随笔為你收集整理的Node.js 入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构——学期总结
- 下一篇: ftp列表错误或长城宽带连不上ftp的解