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)
})