Nodejs學(xué)習(xí)筆記

Node.js 是單進(jìn)程單線(xiàn)程應(yīng)用程序,但是通過(guò)事件和回調(diào)支持并發(fā),所以性能非常高。
nodejs由以下模塊組成:
引入 required 模塊:我們可以使用 require 指令來(lái)載入 Node.js 模塊锈至。
創(chuàng)建服務(wù)器:服務(wù)器可以監(jiān)聽(tīng)客戶(hù)端的請(qǐng)求,類(lèi)似于 Apache 译秦、Nginx 等 HTTP 服務(wù)器峡捡。
接收請(qǐng)求與響應(yīng)請(qǐng)求 服務(wù)器很容易創(chuàng)建,客戶(hù)端可以使用瀏覽器或終端發(fā)送 HTTP 請(qǐng)求筑悴,服務(wù)器接收請(qǐng)求后返回響應(yīng)數(shù)據(jù)们拙。

創(chuàng)建服務(wù)器
首先要引入http模塊
var http = require("http");
通過(guò)
http.createServer() 方法創(chuàng)建服務(wù)器
demo:
var http = require('http');http.createServer(function (request, response) { // 發(fā)送 HTTP 頭部 // HTTP 狀態(tài)值: 200 : OK // 內(nèi)容類(lèi)型: text/plain response.writeHead(200, {'Content-Type': 'text/plain'}); // 發(fā)送響應(yīng)數(shù)據(jù) "Hello World" response.end('Hello World\n');}).listen(8888);// 終端打印如下信息console.log('Server running at http://127.0.0.1:8888/');
寫(xiě)入數(shù)據(jù)可以使用write()
response.write("Hello World");
response.write(" IAM LQ");
response.write(data.toString());
response.end();

使用package.json
npm init 去創(chuàng)建

Node.js REPL交互式解釋器
http://www.runoob.com/nodejs/nodejs-repl.html

Nodejs 回調(diào)函數(shù)
demo:
var http=require('http');//http服務(wù)
var fs = require("fs");//讀取文件
http.createServer(function(request,response){
response.writeHead(200,{'Content-Type':'text/plain'});
//讀取文件信息 將返回值 給response
//var data = fs.readFileSync('input.txt'); 這種方式 是 同步
fs.readFile('message.txt', function (err, data) {
if (err) return console.error(err);
response.end(data.toString());
});
}).listen(8888);

console.log('運(yùn)行在 http://localhost:"8888');

Nodejs 事件循環(huán)
綁定和監(jiān)聽(tīng)事件 需要引入events 模塊 并且通過(guò)EventEmitter 類(lèi)來(lái)綁定和監(jiān)聽(tīng)事件
eventEmitter.on('你起的名字',function(){
//這里是這個(gè)事件對(duì)應(yīng)的do something
})
eventEmitter.emit('你起的名字');//這樣子去執(zhí)行你寫(xiě)好的事件

demo:
// 引入 events 模塊
var events = require('events');
// 創(chuàng)建 eventEmitter 對(duì)象
var eventEmitter = new events.EventEmitter();

//創(chuàng)建鏈接函數(shù)
eventEmitter.on('connection',function(){
console.log('鏈接成功');
eventEmitter.emit('data_received');
});

// 使用匿名函數(shù)綁定 data_received 事件
eventEmitter.on('data_received', function(){
console.log('數(shù)據(jù)接收成功。');
});

// 觸發(fā) connection 事件
eventEmitter.emit('connection');

console.log("程序執(zhí)行完畢阁吝。");

Buffer緩沖區(qū)
專(zhuān)門(mén)存放二進(jìn)制數(shù)據(jù)
new Buffer創(chuàng)建buffer對(duì)象實(shí)例 write返回實(shí)際寫(xiě)入的大小
寫(xiě)入demo:
var buf = new Buffer(256);
var len = buf.write("www.runoob.cn",0,8,"utf8");//數(shù)據(jù)砚婆,開(kāi)始下標(biāo),能存多少位突勇,編碼方式

console.log("寫(xiě)入字節(jié)數(shù) : "+ len);//8
存入漢子并且打印出來(lái):
var buf = new Buffer('你好我是數(shù)據(jù)');

console.log(buf.toString());
合并buffer:
var buffer1 = new Buffer('菜鳥(niǎo)教程 ');var buffer2 = new Buffer('www.runoob.com');var buffer3 = Buffer.concat([buffer1,buffer2]);console.log("buffer3 內(nèi)容: " + buffer3.toString());

Node.js Stream(流)
http 服務(wù)器發(fā)起請(qǐng)求的request 對(duì)象就是一個(gè) Stream

createWriteStream//寫(xiě)入流
createReadStream//讀取流
創(chuàng)建對(duì)象并且指向文件對(duì)象
var readerStream = fs.createReadStream('input.txt');
var writerStream = fs.createWriteStream('output.txt');
寫(xiě)入數(shù)據(jù) 并且定義編碼規(guī)范
var data='我是寫(xiě)入的數(shù)據(jù)'
writerStream.write(data,'UTF8');
讀取數(shù)據(jù)并且打印
// 設(shè)置編碼為 utf8装盯。
var data='';
readerStream.setEncoding('utf8');
// 讀取數(shù)據(jù)并且打印
readerStream.on('data', function(data) {
data = data;
console.log(data);
});
以下是數(shù)據(jù)copy 一個(gè)文件讀取存入另一個(gè)文件
var fs = require("fs");

// 創(chuàng)建一個(gè)可讀流
var readerStream = fs.createReadStream('message.txt');

// 創(chuàng)建一個(gè)可寫(xiě)流
var writerStream = fs.createWriteStream('book.txt');

// 管道讀寫(xiě)操作
// 讀取 input.txt 文件內(nèi)容坷虑,并將內(nèi)容寫(xiě)入到 output.txt 文件中
readerStream.pipe(writerStream);

console.log("程序執(zhí)行完畢");
壓縮文件
var fs = require("fs");var zlib = require('zlib');// 壓縮 input.txt 文件為 input.txt.gzfs.createReadStream('input.txt') .pipe(zlib.createGzip()) .pipe(fs.createWriteStream('input.txt.gz')); console.log("文件壓縮完成。");
解壓文件
var fs = require("fs");var zlib = require('zlib');// 解壓 input.txt.gz 文件為 input.txtfs.createReadStream('input.txt.gz') .pipe(zlib.createGunzip()) .pipe(fs.createWriteStream('input.txt')); console.log("文件解壓完成验夯。");

nodejs 模塊系統(tǒng)
優(yōu)先加載原生模塊 例如http猖吴、fs、path等
var http=require('http');
module.exports=function(){} or 對(duì)象

Nodejs函數(shù)
和JS一樣

nodejs路由
我們需要的所有數(shù)據(jù)都會(huì)包含在request對(duì)象中挥转,該對(duì)象作為onRequest()回調(diào)函數(shù)的第一個(gè)參數(shù)傳遞海蔽。但是為了解析這些數(shù)據(jù),我們需要額外的Node.JS模塊绑谣,它們分別是url和querystring模塊党窜。
說(shuō)白了就是路徑
var pathname = url.parse('http://baidu.com/a/b?a=1').pathname;
var router=url.parse('http://baidu.com/a/b?a=1').query
response.write(pathname+" "+router);

會(huì)出現(xiàn) /a/b a=1

node全局對(duì)象
response.write(__filename);D:\nodejsdemo\global.js
response.write(__dirname);D:\nodejsdemo
setTimeout(cb, ms)
clearTimeout(t)
setInterval(cb, ms)
console
process process 是一個(gè)全局變量,即 global 對(duì)象的屬性借宵。 和系統(tǒng)交互要用到

nodejs常用工具 util
util 是一個(gè)Node.js 核心模塊幌衣,提供常用函數(shù)的集合,用于彌補(bǔ)核心JavaScript 的功能 過(guò)于精簡(jiǎn)的不足壤玫。
用于繼承
util.inherits(child,parent)
只能繼承原型中定義的函數(shù) 即通過(guò)prototype擴(kuò)展的函數(shù)
構(gòu)造函數(shù)內(nèi)部創(chuàng)造的不繼承
util.inspect任意對(duì)象轉(zhuǎn)換 為字符串的方法豁护,通常用于調(diào)試和錯(cuò)誤輸出。它至少接受一個(gè)參數(shù) object欲间,即要轉(zhuǎn)換的對(duì)象楚里。
util.isArray(object)如果給定的參數(shù) "object" 是一個(gè)數(shù)組返回true,否則返回false猎贴。
util.isRegExp(object)如果給定的參數(shù) "object" 是一個(gè)正則表達(dá)式返回true班缎,否則返回false。
util.isDate(object)如果給定的參數(shù) "object" 是一個(gè)日期返回true她渴,否則返回false达址。
util.isError(object)如果給定的參數(shù) "object" 是一個(gè)錯(cuò)誤對(duì)象返回true,否則返回false趁耗。

應(yīng)用框架Express
安裝:npm install express --save
以下幾個(gè)重要的模塊需要與express一起安裝:
$ npm install body-parser --save$ npm install cookie-parser --save$ npm install multer --save
body-parser 處理JSON RAW Text URL編碼的數(shù)據(jù)
cookie-parser解析cookie的工具 通過(guò)req.cookies 可以取到傳來(lái)的cookie 轉(zhuǎn)成對(duì)象
multer 處理enctype="multpart/form-data"的表單數(shù)據(jù)
demo: 這里配置路由
var express=require('express');
var app=express();
app.get('/',function(req,res){
res.send('HELLO WORD2');
})
app.get('/app',function(req,res){
res.send('進(jìn)入了另一個(gè)路徑');
})
var server=app.listen(8888,function(){
var host=server.address().address
var port=server.address().port
console.log("應(yīng)用實(shí)例沉唠,訪(fǎng)問(wèn)地址為 http://", host, port)
})
靜態(tài)資源
app.use(express.static('public'))
http://localhost:8888/img/2.png 就不用寫(xiě)public了

設(shè)置路由 編寫(xiě)接口
var express=require('express');
var app=express();
//靜態(tài)文件
app.use(express.static('public'))
//設(shè)置默認(rèn)入口
app.get('/',function(req,res){
res.sendFile(__dirname+"/"+"index.html");
})
//接口
app.get('/message',function(req,res){
res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});//設(shè)置response編碼為utf-8
obj={
id:req.query.id,
name:req.query.name
}
res.end(JSON.stringify(obj));
})
var server=app.listen(8888,function(){
var host=server.address().address
var port=server.address().port
console.log("應(yīng)用實(shí)例,訪(fǎng)問(wèn)地址為 http://", host, port)
})

Post的demo:必須要引入body-parser 需要安裝依賴(lài)
var urlencodedParser = bodyParser.urlencoded({ extended: false }) 是必須的
var express=require('express');
var app=express();
var bodyParser = require('body-parser');
// 創(chuàng)建 application/x-www-form-urlencoded 編碼解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })
//靜態(tài)文件
app.use(express.static('public'))
//設(shè)置默認(rèn)入口
app.get('/',function(req,res){
res.sendFile(__dirname+"/"+"post.html");
})
//接口
app.post('/message',urlencodedParser,function(req,res){
res.writeHead(200,{'Content-Type':'text/html;charset=utf-8'});//設(shè)置response編碼為utf-8
obj={
id:req.body.id,
name:req.body.name
}
res.end(JSON.stringify(obj));
})
var server=app.listen(8888,function(){
var host=server.address().address
var port=server.address().port
console.log("應(yīng)用實(shí)例苛败,訪(fǎng)問(wèn)地址為 http://", host, port)
})

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末右冻,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子著拭,更是在濱河造成了極大的恐慌,老刑警劉巖牍帚,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件儡遮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡暗赶,警方通過(guò)查閱死者的電腦和手機(jī)鄙币,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)肃叶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人十嘿,你說(shuō)我怎么就攤上這事因惭。” “怎么了绩衷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵蹦魔,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我咳燕,道長(zhǎng)勿决,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任招盲,我火速辦了婚禮低缩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘曹货。我一直安慰自己咆繁,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布顶籽。 她就那樣靜靜地躺著玩般,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蜕衡。 梳的紋絲不亂的頭發(fā)上壤短,一...
    開(kāi)封第一講書(shū)人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音慨仿,去河邊找鬼久脯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镰吆,可吹牛的內(nèi)容都是我干的帘撰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼万皿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼摧找!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起牢硅,我...
    開(kāi)封第一講書(shū)人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蹬耘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后减余,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體综苔,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了如筛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片堡牡。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杨刨,靈堂內(nèi)的尸體忽然破棺而出晤柄,到底是詐尸還是另有隱情,我是刑警寧澤妖胀,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布芥颈,位于F島的核電站,受9級(jí)特大地震影響做粤,放射性物質(zhì)發(fā)生泄漏浇借。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一怕品、第九天 我趴在偏房一處隱蔽的房頂上張望妇垢。 院中可真熱鬧,春花似錦肉康、人聲如沸闯估。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)涨薪。三九已至,卻和暖如春炫乓,著一層夾襖步出監(jiān)牢的瞬間刚夺,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工末捣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留侠姑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓箩做,卻偏偏與公主長(zhǎng)得像莽红,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子邦邦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

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