NodeJS Day1

1.模塊化開(kāi)發(fā)思想:一個(gè)模塊實(shí)現(xiàn)一個(gè)功能

  • 模塊化開(kāi)發(fā)的好處
    • 避免變量污染,命令沖突
    • 提高代碼復(fù)用率
    • 提供代碼可維護(hù)性
    • 依賴關(guān)系的管理更方便

2.模塊化規(guī)范

commonJS ESModule AMD EMD
node.js es6module requirejs sea.js

AMD -> CMD -> ESMoudule(2015)


3.nodejs是一個(gè)基于 Chrome V8 引擎的javascript運(yùn)行環(huán)境(后臺(tái)語(yǔ)言,跟javascript很像)

node運(yùn)行:通過(guò)node命令,打開(kāi)命令提示符(cmd),進(jìn)入到要運(yùn)行的文件的目錄下,通過(guò)node fileName

nodejs出現(xiàn)于2009年,流行于2013 15年

nodejs安裝完成,打開(kāi)cmd運(yùn)行node -v能夠輸出版本號(hào),說(shuō)明安裝成功(npm -v)

nodejs中模塊化的概念:
nodejs中的模塊化實(shí)現(xiàn)是基于commonjs規(guī)范,一個(gè)文件就是一個(gè)模塊,提供了特定的功能點(diǎn)。

  • 如何使用這個(gè)模塊
    • 1.核心模塊 require('模塊名字')
    • 2.第三方模塊 npm安裝第三方模塊 require('模塊名字')
    • 3.直接寫(xiě)的模塊 require('相對(duì)路徑')

4.nodejs中的核心模塊

  • http
  • url
  • fs
  • path

4.1

  • url
    • url.parse方法(解析url字符串為url對(duì)象)
    • 如果將第二個(gè)參數(shù)傳遞為true,那么得到的url對(duì)象中query屬性會(huì)被解析為對(duì)象的形式
    • url.format 將對(duì)象轉(zhuǎn)字符串
const urlObj = url.parse(str,true);
console.log(urlObj.query.name);
console.log(urlObj.query.age);
//http://localhost:3100?name=張三
//引入需要用到的模塊
const http = require('http');
const url = require('url');

const server = http.createServer((req,res) => {
    let params = url.parse(req.url,true).query;
    //設(shè)置http頭部 狀態(tài)碼200 文件類型html 字符集utf8
    res.writeHead(200,{'Content-type':'text/html;charset=utf-8'});
    //響應(yīng)數(shù)據(jù)
    res.write(params.name + '是個(gè)人才');
    //結(jié)束請(qǐng)求
    res.end();
});
server.listen(3100,'127.0.0.1',function(){
    console.log('已經(jīng)啟動(dòng),訪問(wèn):http://127.0.0.1:3100');
});

解碼decodeURIComponent 、加碼encodeURIComponent

res.write (decodeURIComponent(params.name + '是個(gè)人才'));

4.2

  • fs模塊提供的方法是操作文件的
    • fs.readFile
    • fs.writeFile
    • fa.readFilesync (同步)
    • fs.writeFilesync (同步)
讀文件:fs.readFile(file,[options],callback)

參數(shù)1:要讀取的文件路徑,必填

參數(shù)2:讀取文件時(shí)的選項(xiàng),比如:文件編碼utf8,選填

參數(shù)3:文件讀取完畢后的回調(diào)函數(shù),必填

  • 讀文件注意:

該操作采用異步執(zhí)行(有回調(diào)函數(shù))

回調(diào)函數(shù)有兩個(gè)參數(shù),err和data(err表示在讀取文件的操作過(guò)程中是否出錯(cuò),data為數(shù)據(jù))

如果讀取文件時(shí)沒(méi)有指定編碼,返回二進(jìn)制數(shù)據(jù)(如指定編碼utf8,返回指定編碼數(shù)據(jù))

只要異步操作,回調(diào)函數(shù)第一個(gè)都是錯(cuò)誤對(duì)象err優(yōu)先

// 讀文件
fs.readFile("./test.txt", (err, data) => {
  if (err) {
    console.log("讀取失敗");
    console.log(err);
  } else {
    console.log(data.toString());
  }
});
寫(xiě)文件:fs.writeFile(file,data,[options],callback);

參數(shù)1:要寫(xiě)入的文件路徑,必填

參數(shù)2:要寫(xiě)入的數(shù)據(jù),必填

參數(shù)3:寫(xiě)入文件時(shí)的選項(xiàng),如文件編碼

參數(shù)4:文件寫(xiě)入完畢后的回調(diào)參數(shù),必填

*寫(xiě)文件注意:

該操作采用異步執(zhí)行

如果文件存在則替換原內(nèi)容

默認(rèn)寫(xiě)入的文件編碼為utf8

回調(diào)函數(shù)有1個(gè)參數(shù):err表示在寫(xiě)入文件的操作過(guò)程中是否出錯(cuò)(出錯(cuò)err!=null,成功err===null)

  • writeFile寫(xiě)入文件是先把文件內(nèi)容清空在寫(xiě)入,若要追加寫(xiě)入可使用appendFile函數(shù)
const fs = require("fs");

// 寫(xiě)文件
fs.writeFile("./test.txt", "hello world", err => {
  console.log("寫(xiě)文件開(kāi)始");
  if (err) {
    console.log("寫(xiě)入文件失敗");
    console.log(err);
  } else {
    console.log("寫(xiě)入文件成功");
  }
});

// 同步的讀取文件,如果成功,會(huì)直接return 出來(lái)
let data = fs.readFileSync("./test.txt");
console.log(data.toString());//將數(shù)據(jù)轉(zhuǎn)字符串輸出

// fs.writeFileSync("./test.txt", "hello nodejs");
// console.log("寫(xiě)文件結(jié)束");

4.3

  • path 模塊 處理文件路徑相關(guān)的問(wèn)題
    • path.resolve();
    • path.join();

相同點(diǎn):都能夠接受多個(gè)參數(shù),每個(gè)參數(shù)都是一個(gè)路徑

不同點(diǎn):

1.resolve方法,返回的一定是一個(gè)絕對(duì)路徑,而join方法只是簡(jiǎn)單將多個(gè)參數(shù)拼接到一起

let str = path.resolve("./utils", "./index.js");
console.log(str); // C:\Users\Administrator\Desktop\1-nodejs\utils\index.js

let str = path.join("./utils", "./index.js");
console.log(str); // utils\index.js

2.resolve方法,如果某個(gè)參數(shù)是以根路徑開(kāi)始的,那么這個(gè)參數(shù)前面的參數(shù)都將被刪除(覆蓋),而join不同

let str1 = path.resolve("c:", "D:", "a.txt");
console.log(str1);  //D:\a.txt
let str2 = path.join("c:", "D:", "a.txt");
console.log(str2);  //c:\D:\a.txt
  • 全局變量

__dirname;代表當(dāng)前運(yùn)行的文件所在的目錄的絕對(duì)路徑

__filename;代表當(dāng)前運(yùn)行的文件所在的絕對(duì)路徑

console.log(__dirname);  //C:\Users\Administrator\Desktop\1-nodejs\day01
console.log(__filename);  //C:\Users\Administrator\Desktop\1-nodejs\day01\05-path.js

console.log(path.resolve(__dirname, "./utils/index.js"));  //C:\Users\Administrator\Desktop\1-nodejs\day01\utils\index.js
console.log(path.join(__dirname, "./utils/index.js"));  //C:\Users\Administrator\Desktop\1-nodejs\day01\utils\index.js

5.處理POST請(qǐng)求

const http = require("http");
const querystring = require("querystring");

const server = http.createServer((req, res) => {
  // 處理一下 post 請(qǐng)求傳遞過(guò)來(lái)的參數(shù)
  // 1. 我如何發(fā)送 post 請(qǐng)求    模擬請(qǐng)求工具(postman | insomina)

  // 2. 如何得到前端傳遞過(guò)來(lái)的post請(qǐng)求的參數(shù) {username: 'admin', password: 123}
  // 2.1 監(jiān)聽(tīng)請(qǐng)求傳輸?shù)倪^(guò)程
  let raw = ""; // 請(qǐng)求體
  req.on("data", chunk => {
    // chunk 每次傳輸?shù)臅r(shí)候的數(shù)據(jù)
    // data 事件,在請(qǐng)求體大的情況下,會(huì)多次進(jìn)入。
    raw += chunk;
  });
  // 2.2 監(jiān)聽(tīng)請(qǐng)求傳輸完成
  req.on("end", () => {
    console.log(raw); // 查詢字符串
    // querystring 模塊
    let obj = querystring.parse(raw);
    console.log(obj);
    res.write("hello" + obj.username);
    res.end();
  });
});
server.listen(3000);
  • require.on監(jiān)聽(tīng)請(qǐng)求(傳輸?shù)倪^(guò)程)
    • data 事件,在請(qǐng)求體大的情況下,會(huì)多次進(jìn)入
    • chunk 每次傳輸?shù)臅r(shí)候的數(shù)據(jù)
  • require.on監(jiān)聽(tīng)請(qǐng)求(傳輸完成)
    • end 事件 請(qǐng)求完成
  • querystring
    • 將類似(name=%E5%B0%8F%E8%8D%9F&year=3)的字符串轉(zhuǎn)成對(duì)象
    • 不使用url是因?yàn)閡rl根據(jù)'?'來(lái)截取,此處不推薦使用

安裝nodemon可以讓nodejs啟動(dòng)的服務(wù)自己在文件修改后,自動(dòng)重新啟動(dòng)

  • 全局安裝一個(gè)nodemon工具類
    • npm install -g nodemon
    • nodemon -v
    • 將node命令換成nodemon命令來(lái)使用即可
  • 問(wèn)題:
    安裝之后,輸入nodemon -v 不能得到版本號(hào),重新啟動(dòng)命令提示符(終端)之后還是報(bào)錯(cuò)。需要按如下方法解決(環(huán)境變量問(wèn)題)
    • 通過(guò)npm全局安裝的模塊,安裝到:C:\Users\Administrator\AppData\Roaming\npm
    • 將這個(gè)路徑添加到系統(tǒng)的環(huán)境變量中:右擊此電腦 -> 屬性 -> 高級(jí)系統(tǒng)設(shè)置 -> 環(huán)境變量 -> 找到系統(tǒng)變量path雙擊打開(kāi) -> 將安裝的模塊路徑添加進(jìn)去保存即可
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容