新時(shí)期的Node.js入門(mén)總結(jié)

基礎(chǔ)匯總

  1. require引用的文件中不要有內(nèi)部調(diào)用欠母,否則可能有未知隱患(內(nèi)存泄漏、或者直接崩潰)

  2. Buffer 是Node特有的數(shù)據(jù)類型(固有屬性吆寨、不需要require)赏淌,主要用來(lái)處理二進(jìn)制數(shù)據(jù)(Buffer通常表現(xiàn)為十六進(jìn)制的字符串),新Node API Buffer()方法為Deprecated啄清,推薦使用Buffer.form來(lái)初始化一個(gè)Buffer對(duì)象

    buffer.toString([encoding],[start],[end]) buffer 支持編碼類型 ASCII Base64 Binary Hex UTF-8 UTF-16LE/UCS-2

    Buffer一個(gè)常用的場(chǎng)景就是HTTP的POST請(qǐng)求六水,例如

    var body = ''

    req.setEncoding('utf-8');

    req.on('data',function(chumk){

    body += chunk;

    })

    req.on('end',function(){

    })

  3. Fill System 是Node中使用最為頻繁的模塊之一,該模塊提供了讀寫(xiě)文件的能力辣卒,是借助于底層的linuv的C++ API實(shí)現(xiàn)的掷贾。

    常用API

    readFile writeFile stat

    fs.stat獲取文件的狀態(tài)(可以用來(lái)判斷文件還是文件夾)

  4. HTTP服務(wù) 是Node的核心模塊。

    var http = require("http")

    var server = http.createServer(function(req,res){

    // req.url 獲取訪問(wèn)的路徑

    //req.method 請(qǐng)求方法

    req.on("data",function(chunk){

    }).on("end",function(){

    });

    res.writeHead(200,{'Content-Type':'text/plain',"Content-Length":Buffer.byteLength(body)});

    res.end('Hello Node!!!');//每個(gè)HTTP請(qǐng)求的最后都會(huì)被調(diào)用荣茫,當(dāng)客戶端的請(qǐng)求完成后想帅,開(kāi)發(fā)者應(yīng)該調(diào)用該方法結(jié)束HTTP請(qǐng)求

    });

    server.on("connection",function(req,res){

    });

    server.on("request",function(req,res){

    })

    server.listen(3000)

    //處理異常

    process.on("uncaughtException",function(){

    })

    // req.headesr 表示head信息

    POST上傳文件

    表單類型設(shè)置為: enctype="multipart/form-data"

    服務(wù)器處理上傳文件通常基于stream來(lái)實(shí)現(xiàn)啡莉,這里比較流行的第三方庫(kù)formidable

    function dealUpload(req,res){

    var form = new formidable.IncomingForm();

    form.eekpExtension = true;

    form.uploadDir =__dirname;

    from.parse(req,function(err,fields.files){

    if(err)throw err;

    console.log(fields);

    console.log(files);

    res.writeHead(200,{"Content-type":'text/plain'});

    res.end('upload finished');

    })

    }

    HTTP 客戶端服務(wù)

    var http=require("http");

    http.get("http://www.baidu.com",function(res){

    var statusCode = res.statusCode;

    if(statusCode==200){

    res.on("data",function(chunk){

    });

    res.on("end",function(){

    });

    res.on("error",function(e){

    })

    }

    });

    //代理服務(wù)器

    var http =require("http");

    var url = require("url");

    http.createServer(function(req,res){

    var url = req.url.substring(1,req.url.length);//去掉最前面的/

    var proxyRequest = http.request(url,function(pres){

    res.writhHead(pres.statusCode,pres.headers);

    pres.on("data",function(data){

    res.write(data);

    });

    pres.on("end",function(){

    res.end();

    })

    });

    req.on("data",function(data){

    proxyRequest.write(data);

    });

    req.on("end",function(){

    proxyReques.end();

    });

    }).listen(8080);

  5. WebSocekt (比較出名的WebSocket模塊還有Socket.IO)

    Node 實(shí)現(xiàn)WebSocket

    var WebSocketServer = require("ws").Server;

    var wss = new WebScoketServer({port:3304});

    wss.on("connection",function(ws){

    ws.on("message",function(message){

    console.log(message);

    });

    ws.send("Node Hello WebSocket");

    })

  6. Events 在Node中只定義了一個(gè)類EventEmitter

    var eventEmitter = require("events");

    var myEmitter = new eventEmitter();

    myEmitter.on("begin",function(){//注冊(cè)一個(gè)begin事件

    console.log("begin");

    });

    myEmitter.emit("begin");//觸發(fā)begin事件

  7. 多進(jìn)程服務(wù)

    child_process模塊中包括很多創(chuàng)建子進(jìn)程的方法港准,包括fork、spawn咧欣、exec浅缸、execFile

    Cluster是Node 0.6之后新增模塊(Cluster可以看做是做了封裝的child_process模塊)

  8. Proces對(duì)象是一個(gè)全局的對(duì)象,每個(gè)Node進(jìn)程都有獨(dú)立的process對(duì)象魄咕,該對(duì)象中存儲(chǔ)了當(dāng)前的環(huán)境變量衩椒,也定義了一些事件

    process.getuid();//用戶id

    process.argv;//Node的命令行參數(shù)列表

    process.pid;//進(jìn)程id

    process.cwd();//當(dāng)前目錄

    process.versoin;//Node版本

    process.env;//

  9. Timer setTimeout setInterval

  10. nvm

> nvm install version 安裝某個(gè)版本的node
> 
> nvm use veresion 切換到某個(gè)版本
> 
> nvm ls 列出當(dāng)前安裝的所有的Node版本
> 
> let關(guān)鍵字 會(huì)創(chuàng)建一個(gè)塊級(jí)作用域
> 
> const變量不可以再被修改
  1. 函數(shù)
> 參數(shù)可以設(shè)置默認(rèn)值
> 
> function gred(x="a",y="b"){
> 
> }
> 
> Spread運(yùn)算符(...)展開(kāi)運(yùn)算符
> 
> var ab=["ab","cd"]
> 
> gred(..ab);
> 
> 箭頭函數(shù)(ES6)
> 
> var func= a=>a;等價(jià)于
> 
> var func = function(a){
> 
> return a;
> 
> }
> 
> 多個(gè)參數(shù)
> 
> var func=(a,b)=>{
> 
> console.log(a,b);
> 
> }
  1. Promise 異步處理
> var promis = new Promise(function(resolve.reject){
> 
> //執(zhí)行相關(guān)異步操作
> 
> //resolve(data)
> 
> // reject(err)
> 
> }),then(res=>{}).catch(err=>{});
> 
> promise.all 多個(gè)promise需要執(zhí)行封裝為一個(gè)
  1. 回調(diào)的終點(diǎn)--async/await
> node 7.6.0之后原生支持
> 
> var asyncReadFile = async function(){
> 
> var result1 = await readFile('a.txt');
> 
> var result 2 = await readFile('b.txt');
> 
> console.log(result1);
> 
> console.log(result2);
> 
> }
  1. Koa2 構(gòu)建web站點(diǎn)
> koa-static 靜態(tài)文件服務(wù)
> 
> koa-router 路由服務(wù)
> 
> koa-bodyparse
  1. MongoDB (Mongoose)
> npm install mongoose
> 
> var mongoose = require("mongoose")
> 
> mongoose.connect("mongodb://xxx/test");
> 
> var db = mongose.connection;
> 
> db.on("error",console.error.bind(console.'conection error:'))
> 
> db.on('open'.function(callback){
> 
> })
> 
> var loginSchema = new mongoose.Schema({
> 
> username:String,
> 
> password:String
> 
> })
> 
> var login = db.model("login",loginSchema,"login")//第一個(gè)名稱是創(chuàng)建實(shí)例使用的名稱,第二個(gè)是表結(jié)構(gòu)參數(shù)哮兰,第三個(gè)是數(shù)據(jù)庫(kù)顯示的結(jié)合的名稱不填的話默認(rèn)是實(shí)例名稱的復(fù)數(shù)s
> 
> var user1 = new login({username:"zhang",password:'test'})
> 
> user1.save(function(err){
> 
> if(err) return handleError(err)
> 
> })
  1. Redis
> npm install redis
> 
> var redis = require("redis")
> 
> var client = redis.createClient('6379','127.0.0.1')
> 
> client.on("error",function(error){
> 
> })
> 
> client.on("ready",funciont(){
> 
> })
> 
> client.set("name","zhang",redis.print)
> 
> client.get("name",function(err,reply){
> 
> })
> 
> client.publish('test',"hello,Node")
> 
> client.subscribe('test')
> 
> client.on("message",function(channel,message){
> 
> })
  1. Localtunnel
> localtunnel是一個(gè)有名的第三方模塊
> 
> localtunnel.me
  1. 爬蟲(chóng)
> robot.txt是爬蟲(chóng)默認(rèn)規(guī)則
> 
> PHelper
> 
> cheerio
> 
> request.js //node第三方的HTTP請(qǐng)求 [https://github.com/request/request](https://github.com/request/request)
> 
> cheerio 網(wǎng)頁(yè)解析 [https://github.com/cheeriojs/cheerio](https://github.com/cheeriojs/cheerio)
> 
> selenium
> 
> MongoDB存儲(chǔ)數(shù)據(jù)
> 
> Redis消息隊(duì)列
  1. 測(cè)試與調(diào)試
> 使用Assert模塊
> 
> Jasmine
> 
> Ava.js
> 
> nyc代碼覆蓋率
> 
> Travis
> 
> node-inspector v8-inspector
  1. package.json
> package.json常用字段
> 
> name項(xiàng)目名稱
> 
> verion項(xiàng)目版本號(hào)
> 
> scripts項(xiàng)目不同階段的命令
> 
> version字段說(shuō)明
> 
> version:完全匹配
> 
> `>`version 大于這個(gè)版本
> 
> `>=`version 大于登錄這個(gè)版本
> 
> ~version 非常接近這個(gè)版本
> 
> ^version與這個(gè)版本不兼容
> 
> 1.2.x 這個(gè)符號(hào)1.2.x的版本 x是任意數(shù)字
> 
> *或者“” 任何版本都可以
> 
> version1-version2 版本在version1和version2之間(包括version1和version2)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烟具,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子奠蹬,更是在濱河造成了極大的恐慌朝聋,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件囤躁,死亡現(xiàn)場(chǎng)離奇詭異冀痕,居然都是意外死亡荔睹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)言蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)僻他,“玉大人,你說(shuō)我怎么就攤上這事腊尚《洲郑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵婿斥,是天一觀的道長(zhǎng)劝篷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)民宿,這世上最難降的妖魔是什么娇妓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮活鹰,結(jié)果婚禮上哈恰,老公的妹妹穿的比我還像新娘。我一直安慰自己志群,他們只是感情好着绷,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著锌云,像睡著了一般荠医。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上宾抓,一...
    開(kāi)封第一講書(shū)人閱讀 52,713評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音豫喧,去河邊找鬼石洗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛紧显,可吹牛的內(nèi)容都是我干的讲衫。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼孵班,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼涉兽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起篙程,我...
    開(kāi)封第一講書(shū)人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤枷畏,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后虱饿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拥诡,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡触趴,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了渴肉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冗懦。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仇祭,靈堂內(nèi)的尸體忽然破棺而出披蕉,到底是詐尸還是另有隱情,我是刑警寧澤乌奇,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布没讲,位于F島的核電站,受9級(jí)特大地震影響华弓,放射性物質(zhì)發(fā)生泄漏食零。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一寂屏、第九天 我趴在偏房一處隱蔽的房頂上張望贰谣。 院中可真熱鬧,春花似錦迁霎、人聲如沸吱抚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秘豹。三九已至,卻和暖如春昌粤,著一層夾襖步出監(jiān)牢的瞬間既绕,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工涮坐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留凄贩,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓袱讹,卻偏偏與公主長(zhǎng)得像疲扎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捷雕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容