基礎(chǔ)匯總
require引用的文件中不要有內(nèi)部調(diào)用欠母,否則可能有未知隱患(內(nèi)存泄漏、或者直接崩潰)
-
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(){
})
-
Fill System 是Node中使用最為頻繁的模塊之一,該模塊提供了讀寫(xiě)文件的能力辣卒,是借助于底層的linuv的C++ API實(shí)現(xiàn)的掷贾。
常用API
readFile writeFile stat
fs.stat獲取文件的狀態(tài)(可以用來(lái)判斷文件還是文件夾)
-
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);
-
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");
})
-
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事件
-
多進(jìn)程服務(wù)
child_process模塊中包括很多創(chuàng)建子進(jìn)程的方法港准,包括fork、spawn咧欣、exec浅缸、execFile
Cluster是Node 0.6之后新增模塊(Cluster可以看做是做了封裝的child_process模塊)
-
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;//
Timer setTimeout setInterval
nvm
> nvm install version 安裝某個(gè)版本的node
>
> nvm use veresion 切換到某個(gè)版本
>
> nvm ls 列出當(dāng)前安裝的所有的Node版本
>
> let關(guān)鍵字 會(huì)創(chuàng)建一個(gè)塊級(jí)作用域
>
> const變量不可以再被修改
- 函數(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);
>
> }
- 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è)
- 回調(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);
>
> }
- Koa2 構(gòu)建web站點(diǎn)
> koa-static 靜態(tài)文件服務(wù)
>
> koa-router 路由服務(wù)
>
> koa-bodyparse
- 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)
>
> })
- 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){
>
> })
- Localtunnel
> localtunnel是一個(gè)有名的第三方模塊
>
> localtunnel.me
- 爬蟲(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ì)列
- 測(cè)試與調(diào)試
> 使用Assert模塊
>
> Jasmine
>
> Ava.js
>
> nyc代碼覆蓋率
>
> Travis
>
> node-inspector v8-inspector
- 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)