js中的頂層對象是window
node中頂層對象是global 沒有window這個概念html
在node中一個文件就是一個模塊 每個模塊都有本身的做用域 每個模塊都是屬於當前做用域的而不是全局的 全局的做用域node
var a=1; console.log(a) //1 global.a=100; console.log(a) //1 console.log(global.a) //100
可是在2.js仍然不能使用global.jsgit
每個模塊都有本身的全局 __filename 就會獲得文件當前的位置
這就是node 的自己的模塊化的機制web
require("./1.js") 引入1.js這個模塊
在加載其餘的模塊的時候
一、首先按照加載的模塊文件名稱進行查找
二、若是沒有找到 在模塊文件名稱後邊加上.js 進行查找
三、若是尚未找到 在模塊文件名稱後邊加上.json 進行查找
四、若是尚未找到 在模塊文件名稱後邊加上.node 進行查找 若是尚未找到就會報錯json
在一個模塊中經過var定義的變量 其做用域範圍是當前模塊 外部模塊是不可以直接訪問這個變量 若是咱們想讓在外邊去訪問這個模塊變量 可使用
一、全局掛載的方式 把這個變量做爲global的屬性
1.js中數組
global.a=1;
2.js中瀏覽器
require("./1.js") console.log(__filename) console.log(a) //1 訪問到了1.js中的a的值
就能夠訪問到global.a
可是這樣的作法是不推介的
二、使用模塊對象 module對象 每個模塊都會有這個module對象
module對象 保存提供和當前模塊有關的一些信息 訪問這個對象能夠獲得如下的信息
id: '.', 當前模塊的惟一標識
exports: {}, 經過這個對象 將一個模塊中的局部變量暴露出來
parent: null,
filename: 'G:\gitworkspace\node\2.js',
loaded: false,
children:
[ Module {服務器
id: 'G:\\gitworkspace\\node\\1.js', exports: {}, parent: [Circular], filename: 'G:\\gitworkspace\\node\\1.js', loaded: true, children: [], paths: [Object] } ],
paths:
[ 'G:\gitworkspace\node\node_modules',app
'G:\\gitworkspace\\node_modules', 'G:\\node_modules' ] }
在這個module有一個很重要的子對象 exports 對象 能夠經過這個對象將模塊中的局部對象暴露
1.js異步
var a=1; module.exports.a=a;
2.js
var m1=require("./1.js") console.log(m1.a) //就能夠輸出1了
在模塊做用域內 還有一個內置的模塊對象 全局的exports 其實就是module.exports
console.log(exports===module.exports) //true
可是在使用的過程當中須要注意小細節 不要讓module.exports的引用斷開
1.js中
var a=1; module.exports=[1,2,3]; //斷開了module.exports的引用 exports.a=a;
2.js中
var m1=require("./1.js") //require的返回對象就是1.js模塊中的module console.log(m1.a) //undefined 這裏就訪問不到了a console.log(exports===module.exports)
同時在模塊做用域內,還有一個內置的模塊對象,exports 他其實就是module.exports 如上
因此在使用模塊化的時候 儘可能是在module.exports或者exports添加屬性 而不是具體的更改引用地址
每個模塊做用域下邊都有這樣的一個屬性 表明的是這個文件所在目錄的路徑 蛋撻不是全局的屬性 只是模塊做用域的一個固有的屬性
返回的是當前文件解析後的絕對路徑 不帶文件自己 也是模塊的固定屬性不是global的屬性
setInterval函數 clearInterval()
setTimeout函數 clearTimeout() 這四個函數均可以使用
是global對象的屬性 經過對process對象的訪問 能夠獲得訪問當前的進程 使咱們能夠對當前運行的程序的進程進行訪問和控制 process對象有以下的屬性
stdin stdout 標準輸入輸出流 默認狀況輸入流是關閉的 因此使用的時候先開啓
標準輸入設備:鍵盤 鼠標 攝像頭 掃描儀
process.stdin.resume(); process.stdin.on("data",function (data) { process.stdout.write(data) })
實現了 用戶輸入什麼 回車的時候就會輸出什麼
標準輸出設備:顯示器 繪圖儀
想控制太輸出 process.stdout.write("sas")
一、argv
數組 包含命令行參數的數組
會輸出
[ 'C:\Program Files\nodejs\node.exe', //運行改程序的編譯器
'G:\gitworkspace\node\2.js' ] //當前的.js文件
二、env
會得道用戶的運行環境 因此這裏也能夠看出js操做的是瀏覽器 node操做的是系統
三、version
返回node的版本
四、pid
返回當前進程的pid
五、title
返回當前進程顯示的名稱
六、platform
返回操做平臺的信息
七、exit()
退出這個進程
一個用於更好的操做二進制數據的類 從文件或輸入流中讀取內容
使用方法
一、 var buffer=new Buffer(10) //建立一個buffer對象 併爲這個對象分配一個大小
當咱們一個buffer分配空間之後 其長度是固定的 不能更改
二、使用數組來新建一個buffer var bb=new Buffer([1,2,3])
這種方式聲明的buffer的長度也是固定的
三、使用字符串聲明一個buffer var ss=new Buffer(string,'utf-8');
把字符串轉化爲二進制格式的
將16進制的編碼轉化爲字符 String.fromCharCode()
buffer的方法
一、buffer的write方法
var ss=new Buffer("sasasa"); for(var i=0;i<ss.length;i++){ console.log(String.fromCharCode(ss[i])) }
buffer.write(string,[offset] )做用是根據參數offset來指定開始添加字符串的
var ss="miaov" var bf=new Buffer(5); bf.write(ss) console.log(bf) //<Buffer 6d 69 61 6f 76>
可是指定了offset之後
var ss="miaov" var bf=new Buffer(5); bf.write(ss,2) console.log(bf) //<Buffer 04 00 6d 69 61>
二、buffer.toString() 方法 將buffer轉換成字符串
var ss="miaov" var bf=new Buffer(5); bf.write(ss) console.log(bf.toString()) //miaov
var ss="妙味" var bf=new Buffer(ss); console.log(bf) //<Buffer e5 a6 99 e5 91 b3>
因此在node中一個漢字佔3個字節
三、buffer.tojson()
將buffer中的內容轉化爲json格式數據
四、buffer.slice(start,end)
截取buffer中的一部分 可是和原來的老的buffer引用的是一個地址 改變這個新的buffer就會改變原來的五、五、buffer.copy(複製內容到的新區域)
可是這個新區域的引用地址和原來的地址不是同一個地址 因此更改新的區域不會更改原來的buffer
六、buffer的靜態方法 不須要在實例上邊調用的方法
檢測 Buffer是否支持某種編碼 Buffer.isEncoding('utf-8') 檢測是否支持utf-8編碼
檢測 某個變量是不是Buffer Buffer.isBuffer(變量)
Buffer.concat(存着buffer的數組) 返回這個數組內每個元素拼接好的buffer
首先要引入 fs模塊
一、fs.open方法 異步的方式打開文件 不會阻塞後邊代碼的執行 經過回調函數對讀取結果進行處理
fs.open(path,flags,[model],callback)
path 所在的路徑
flags 打開文件的方式 r讀的方式 r+讀寫方式
model 設置文件的模式 讀/寫/執行 4/2/1
callback 當經過open方法之後 調用callback 有兩個參數 error fd(文件的標識)
文件的標識是惟一的標識這個文件 以便於後邊經過這個編號來操做這個打開的文件 從3開始
二、fs.openSync(path,flags) 會阻塞後邊代碼的執行 經過這個方法返回值對讀取結果進行處理
三、fs.read(fd,buffer,offset,length,position,callback)
fs.open('1.txt','r',function (error,fd) { if(error){ console.log("文件打開失敗") } //fs.read(fd,buffer,offset,length,position,callback) //剛纔讀取成功的文件的惟一標識fd var bf1=new Buffer(10); //offset 新的內容添加到的buffer的起始位置 //length 讀取的長度 //position 從文件的哪裏開始 //callback 回調函數 的參數error newbf的length newbf新的buffer fs.read(fd,bf1,0,4,null,function (error,len,newbf) { console.log(error) //null console.log(len) //4 console.log(newbf) //<Buffer 65 72 65 77 00 00 00 00 00 00> }) })
四、fs.writeSync() fs的同步版本
五、fs.write(fd,buffer,offset,length,position,callback)
buffer 要寫入的數據 offset buffer對象中要寫入的數據起始位置 length buffer對象中要寫入的數據的長度 position fd中的起始位置 文件中開始寫的位置 callback 回調函數 error buffer的length 寫入的buffer
fs.write另外一種使用方法 fs.write(fd,'wqds找室內設計師',5,'utf-8')
fs.open('1.txt','w',function (error,fd) { if(error){ console.log("文件打開失敗") } else{ var bf=new Buffer('123'); fs.write(fd,bf,0,3,0,function (error,length) { console.log(arguments) }) } })
六、fs.writeSync() buffer的同步的版本
七、fs.close(fd,callback) 文件打開之後 必定要對文件進行關閉
以上方法都是在文件打開以才能執行的 下面這些方法自帶打開文件的方法
八、fs.writeFile(filename,data,[options],callback) 若是文件不存在就回新建一個文件 而不會報錯
若是文件存在 則新的data會直接覆蓋原有的內容
var fileName="2.txt"; fs.writeFile(fileName,"sasa",function () { })
以上的方法就會新建一個2.txt
九、fs.writeFileSync(filename,data,[options]) 同步版本
十、fs.appendFile(filename,data,callback) 異步的向文件寫入數據
若是文件不存在就回新建一個文件 而不會報錯
若是文件存在 則新的data會追加到原有的內容後邊
固然也有同步版本
十一、fs.exists(path,callback) 檢查指定的目錄是否存在 固然也有同步版本
十二、fs.readFile(fileName,callback)
若是直接輸出data 會獲得的是一個buffer
fs.readFile('1.txt',function (error,data) { if(error){ console.log("讀取失敗") } else{ console.log(data.toString()) } })
固然也有同步的版本
1三、fs.unlink(fileName,callback) 刪除這個文件
var fileName="2.txt"; fs.unlink(fileName,function (error) { if(error){ console.log(error) } })
就會刪除2.txt
1三、fs.rename(fileName,newName,callback)
1四、fs.sat(filename,callback) 會在callback中獲得文件的信息
1五、fs.mkdir(path,[mode],callback) 建立文件夾
1六、fs.rmdir(path,callback) 刪除文件夾
客戶端發送一個http請求到指定的服務器端->服務器端接受並處理請求->返回數據到客戶端
使用http模塊就能夠搭建一個web服務器
一、這個模塊下有一個createServer(回調函數)來建立一個服務器
二、服務器調用.listen(端口號,[主機名],[callback]) 來實現監聽某一窗口
三、server.on(error,callback) 當服務器開啓發生錯誤了 就會觸發這個事件
五、server.on('listening',callback) 當服務器正式監聽的時候就會觸發這個事件
六、server.on('request',callback) 當有客戶端發起請求的時候 就會觸發這個事件
request
這個裏邊有一個對象IncomingMessage 包含如下的信息
獲得客戶端發送過來的信息 url method
response
res.write(data)
res.end() 服務器的響應已經發送完成了 必須調用
res.writeHead(狀態碼,描述,頭信息) 設置頭信息
頭信息:{‘content-type’:'text/html;charset=utf-8'}
text/html 按照html處理 text/plain 告訴客戶端按照文本處理
固然若是不但願寫在頭信息 這一部分的話 也就是上邊的那個鍵值對裏邊
也能夠調用 res.setHeader(key,value)
經過req獲得url req.url
在url中 ?後面的內容叫作查詢字符串
在node中有專門處理url的模塊 引入url模塊
var http=require('http'); var url=require("url"); var server=http.createServer(function (req,res) { var urlString=url.parse(req.url); console.log(urlString) res.write("sasa"); res.end(); }) server.listen(3000);
在這個urlString中包 協議 主機 端口
hash 哈希值部分#後面的內容 search ?+後面的內容 query ?後面的內容