node學習

頂層對象

js中的頂層對象是window
node中頂層對象是global 沒有window這個概念html

node的模塊化

在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

node加載其餘的模塊

require("./1.js") 引入1.js這個模塊
在加載其餘的模塊的時候
一、首先按照加載的模塊文件名稱進行查找
二、若是沒有找到 在模塊文件名稱後邊加上.js 進行查找
三、若是尚未找到 在模塊文件名稱後邊加上.json 進行查找
四、若是尚未找到 在模塊文件名稱後邊加上.node 進行查找 若是尚未找到就會報錯json

module 和module.exorts

在一個模塊中經過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添加屬性 而不是具體的更改引用地址

__filename

每個模塊做用域下邊都有這樣的一個屬性 表明的是這個文件所在目錄的路徑 蛋撻不是全局的屬性 只是模塊做用域的一個固有的屬性

__dirname

返回的是當前文件解析後的絕對路徑 不帶文件自己 也是模塊的固定屬性不是global的屬性
setInterval函數 clearInterval()
setTimeout函數 clearTimeout() 這四個函數均可以使用

process全局對象

是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()
退出這個進程

Buffer

一個用於更好的操做二進制數據的類 從文件或輸入流中讀取內容
使用方法
一、 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

文件系統 File System

首先要引入 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) 刪除文件夾

node實現web開發-->http模塊

客戶端發送一個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)

url的處理

經過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   ?後面的內容
相關文章
相關標籤/搜索