node初步學(xué)習(xí)

一、node的作用和應(yīng)用

  • 脫離瀏覽器運(yùn)行js
  • 后臺API編寫
  • Wepback、Gulp、Npm等等都是強(qiáng)依賴node的
  • 中間層:服務(wù)器中負(fù)責(zé)IO讀寫的中間層服務(wù)器(比如:文件的讀寫、數(shù)據(jù)庫的查詢等都是中間層做比較好)

什么是中間層、作用:

  • 性能好
    (1)異步IO:適合處理高并發(fā)的請求
    (2)也可以做一些需要緩存的事情
  • 幫忙處理數(shù)據(jù):得到前端想要的數(shù)據(jù)類型
  • 提高安全性:遇到web攻擊時,多一層保護(hù)

二、Node的優(yōu)勢

  • 便于前端開發(fā)入門(都是基于js)
  • 性能高
  • 利于前端代碼整合(可以共用模塊)

三、cnpm淘寶鏡像

npm install -g cnpm --registry=https://registry.npm.taobao.org

四、node中的模塊

  • 全局模塊(定義:何時何地都能訪問,不需要引用)
    process.env -(環(huán)境變量)
    process.argv

    console.log(process.argv)----運(yùn)行node hello.js

    console.log(process.argv)----運(yùn)行node hello.js 1 2 3 4

  • 系統(tǒng)模塊(定義: 需要require(),但不需要單獨(dú)下載)
    path - (用于處理文件路徑和目錄路徑的實(shí)用工具)

let path  = require('path');

console.log(path.dirname('/node/a/b/c/1.jpg')); // 文件目錄
console.log(path.basename('/node/a/b/c/1.jpg')); // 文件名
console.log(path.extname('/node/a/b/c/1.jpg')); // 擴(kuò)展名

console.log(path.resolve('/node/a/b/c', '../../', 'd'));
console.log(path.resolve(__dirname, 'index.js'));

fs - (用于文件的讀寫操作)

let fs = require('fs');

// 異步讀取文件
fs.readFile('./a.txt', (err, data) => {
    if (err) {
        console.log(err);
    } else {
        console.log(data); // <Buffer 61 62 63>
        console.log(data.toString());  // abc
    }
})
let fs = require('fs');

// 異步寫文件(1)
fs.writeFile('b.txt', '月薪2元', (err) => {
    if (err) {
        throw err;
    }
})

// 異步寫文件(2)-------  { flag: 'a' }代表追加 
fs.writeFile('b.txt', '月薪2元哈哈哈', { flag: 'a' } , (err) => {
    if (err) {
        throw err;
    }
})
(1)

(2)

同步的話不寫回調(diào)就行了,如:fs.readFileSync('a.txt')fs.writeFileSync('b.txt', '月薪2元'),只不過node經(jīng)常用的是異步的而已。

  • 自定義模塊(定義:require自己封裝的模塊)
    exports:
// mod.js
exports.a = 1;
exports.b = 2;

// 其他文件使用
let mod = require('mod');
console.log(mod.a);
console.log(mod.b);

module:

// mod.js
(1)
module.exports = {
  a: 1,
  b: 2
}
(2)
module.exports = function() {
  console.log('我是一個function');
}
(3)
module.exports = class {
  constructor() {
    this.state = {
      data: '我是一個class'
    }
  }
  show() {
    console.log(this.state.data);
  }
}



// 其他文件使用
(1)
let mod = require('./mod');
console.log('a==', mod.a, '\n', 'b==', mod.b);
// 結(jié)果:
// a== 1
//  b== 2

(2)
let mod = require('./mod');
mod();
// 結(jié)果:
// 我是一個function
(3)
let Mod = require('./mod');
let mod = new Mod()
mod.show();
// 結(jié)果:
// 我是一個class

require:
(1)如果有路徑,就去路徑里面找;
(2)沒有的話就去node_modules里面找;
(3)都沒有的話再去node的安裝目錄里面找。

  • http模塊
    node通常是作為一個服務(wù)器,更多的是作為一個web服務(wù)器。
    重點(diǎn):http.createServer((req, res) => { // })
  • GET請求:
    (1)放在請求頭里(url?xx=xx&xx=xx);
    (2)< 32K;
    (3)url模塊進(jìn)行解析。
    url.parse(req.url):將url和query拆分開來;
    url.parse(req.url, true):將query解析為json格式;
  • POST請求:
    (1)放在請求體里面;
    (2)< 2G;
    (3)querystring幫助解析為json格式。
http.createServer((req, res) => {
    let result = [];
    req.on('data', buffer => { // 二進(jìn)制格式,數(shù)據(jù)大了的話就會分為一條一條的執(zhí)行很多次‘data’,從而就有很多個buffer。
        result.push(buffer); // 將所有的buffer放在一起,后面獲取。
    })
    req.on('end', () => {
        let data = Buffer.concat(result).toString(); // username=admin&password=1234
        console.log(querystring.parse(data)); // [Object: null prototype] { username: 'admin', password: '1234' }
    })
}).listen(8080);

真實(shí)情況不會這樣用,只是了解一下。

五、【登錄注冊功能】實(shí)戰(zhàn)

實(shí)戰(zhàn)代碼已放在github上,查閱請點(diǎn)擊這里。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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