nodejs與javascript,nodejs(二)
摘要:nodejs第二章節回調函數Node.js 異步編程的直接體現就是回調異步編程依托于回調來實現例子1:http服務器回調var http = require(“http”);//引入一個http的模塊var server = http.createServer(function (req,res) { ? ? //向前臺響應內容(數據) ? ? res.end(“大家好
- nodejs第二章節
- 回調函數
- Node.js 異步編程的直接體現就是回調
- 異步編程依托于回調來實現
- 例子1:http服務器回調
- var http = require(“http”);//引入一個http的模塊
var server = http.createServer(function (req,res) {
? ? //向前臺響應內容(數據)
? ? res.end(“大家好,我是yuk”);
});
//listen(端口,域名,成功的回調)
server.listen(8080,”localhost”, function () {
? ? console.log(“服務器啟動成功!”);
});
- 例子2:讀取文件操作
- var fs = require(“fs”);//文件模塊
//異步的方式->當文件讀取完成后執行回調函數內容,不影響其他后續程序的執行
/*var data = fs.readFile(“1.txt”,”utf8”, function (err,data) {
? ? console.log(“讀取文件成功”);
? ? console.log(data);
});*/
//同步獲取文件的方式->必須讀取完成以后再執行之后的程序
var data = fs.readFileSync(“1.txt”,”utf8”);
console.log(data);
console.log(“我是其他的代碼”);
- 常用模塊講解
- util
- 實現繼承
- 例子
- var util = require(“util”);
//實現繼承
function Parent(){
? ? this.name = “老爸”;
? ? this.age = 50;
? ? this.sayHello = function (){
? ? ? ? console.log(‘hello’);
? ? }
}
Parent.prototype.showName = function (){
? ? console.log(this.name);
}
function Child(){
? ? //要繼承函數內部的可以使用call或者apply
? ? this.name = “兒子”;
}
//通過這種方式可以繼承父類原型中的方法和屬性
util.inherits(Child,Parent);
var parentObj = new Parent();
parentObj.showName();
var childObj = new Child();
childObj.showName();
- 輸出對象
- console.log(util.inspect(obj));
- 類型驗證
- console.log(util.isArray([]));//判斷是否為一個數組
console.log(util.isRegExp(/\d/));//判斷是否為一個正則表達式
- event
- 事件概念
- 事件
* 又稱為發布訂閱模式
* 又稱為觀察者模式
* 當主題對象發生變化時,會通知所有的觀察者對象,更新自己的行動
- 獲取事件模塊
- var events = require(“events”).EventEmitter();//老的寫法,跟下面的寫法是等價的
var events = require(“events”);
- 例子:
- var events = require(“events”);
var util = require(“util”);
function Girl(){
? ? //創建一個女神類,它擁有一些事件
}
//要讓女神擁有事件方法需要先繼承events模塊
util.inherits(Girl,events);
function Boy(name,response){
? ? this.name = name;
? ? this.response = response;
}
var boy1 = new Boy(“備胎1”,function (){
? ? console.log(“吃雞腿”);
});
var boy2 = new Boy(“備胎2”, function (){
? ? console.log(“吃牛肉”);
}); -
- var girl = new Girl();
girl.on(“lee”,boy1.response);
girl.addListener(“lee”,boy2.response);
girl.once(“die”,function (){
? ? console.log(“死了”);
});
girl.emit(“die”);//發射事件
girl.emit(“die”);
- 事件
- 注冊事件
- 發射事件
- 其他方法
- 設置最大的監聽數量
- 移除掉單個事件
- girl.removeListener(“ele”,boy1.response);//移除掉單個事件
- 代碼:
- //設置最大的監聽數量
girl.setMaxListeners(2);
//girl.on(“lee”,boy1.response);
girl.removeListener(“lee”,boy1.response);//移除掉單個事件
girl.removeAllListeners(“lee”);
girl.emit(“lee”);
- buffer
- buffer:緩存區,暫時存放在內存里的一段數據
- JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型,在處理文件流時,必須使用到二進制數據,因此在 Node.js中,定義了一個 Buffer 類,該類用來創建一個專門存放二進制數據的緩存區
- 由一個八位字節一個字節元素組成的數組,單位用16進制表示,取值范圍為0-255
- 創建buffer對象的方法:
- 直接創建長度為12的代碼
- var buff = new Buffer(12);//創建長度為12的數組console.log(buff);buf1.fill(255,0);//fill(填充的值,開始位置,結束位置(沒有既全部))console.log(buff);
- 通過數組
- var buff = new Buffer([1,255,0xb3]);
console.log(buff);
- 通過字符串
- var buff = new Buffer(“唐菜也”);
console.log(buff);
- 將buffer轉成字符串通過toString
- var buff = new Buffer([0xe5, 0x94, 0x90, 0xe8, 0x8f, 0x9c, 0xe4, 0xb9, 0x9f]);
- console.log(buf4.toString())
- Node中推薦使用的方式
- var buff = new Buffer([0xe5, 0x94, 0x90, 0xe8, 0x8f, 0x9c, 0xe4, 0xb9, 0x9f]);
var buff = new Buffer([0xe5, 0x94, 0x90, 0xe8, 0x8f]);
var buff = new Buffer([0x9c, 0xe4, 0xb9, 0x9f]);
console.log(buf4.toString());
console.log(buf5.toString());
//占用的內存高
//console.log(Buffer.concat([buf4,buf5]).toString());
//Node中推薦使用的方式
var StringDecoder = require(“string_decoder”).StringDecoder;
var decoder = new StringDecoder();
console.log(decoder.write(buff));
console.log(decoder.write(buff));
- fs
- 文件操作
- 讀取文件
- 寫入文件
- writeFile
- 第一個參數為寫入的文件名
- 第二個為寫入寫入的文件內容
- 第三個為配置參數
- 第四個為回調
- 代碼:
- var fs = require(“fs”);fs.writeFile(“file.txt”,”我是通過寫入的文件內容”,{? ? flag:”a”},function (err){? ? if (err){? ? ? ? return console.error(err);? ? }? ? console.log(“文件寫入成功”);? ? fs.readFile(“file.txt”,”utf8”,function (err,data){? ? ? ? console.log(data);? ? })});
- appendFile
- fs.appendFile(“file.txt”,”\n最佳”,function (err){? ? if (err){? ? ? ? return console.error(err);? ? }? ? console.log(“追加成功”);});
- 復制文件
- fs.readFile(“file.txt”,”utf8”,function(err,data){? ? //console.log(data);? ? fs.writeFile(“file2.txt”,data,{? ? ? ? encoding:”utf8”? ? },function (err){? ? ? ? if (err){? ? ? ? ? ? return console.error(err);? ? ? ? }? ? ? ? console.log(“復制成功”);? ? })});
- 目錄操作
- 創建目錄
- fs.mkdir(“test”,0777, function (err) {
? ? if(err){
? ? ? ? console.error(err);
? ? }
}); - mode 的三個數字,分別表示owner(所有者),group(組用戶),others(其他用戶)所具有的權限。
?1 = x 執行 2 = w 寫 4 = r 讀,比如owner具有所有權限,1+2+4=7,
?又比如group 具有讀 和執行權限 1+4 = 5
- 讀取目錄
- fs.readdir(“test”, function (err,files) {
? ? if (err){
? ? ? ? console.error(err);
? ? }else{
? ? ? ? console.log(files);
? ? }
});
- 查看文件或者目錄詳情
- fs.stat(‘test’, function (err,stat) {
? ? if (err){
? ? ? ? console.error(err);
? ? }else{
? ? ? ? console.log(stat);
? ? }
});
- 判斷文件是否存在
- fs.exists(“test/1.jpg”, function (exists) {
? ? console.log(exists);
})
- 相對路徑獲取絕對路徑
- fs.realpath(“test”, function (err,path) {
? ? console.log(path);
});
- 修改文件名
- fs.rename(“test2”,”test”, function (err) {
? ? if (err){
? ? ? ? console.error(err);
? ? }
});
- stream
- Stream可以算是node里的一出重頭戲,與大數據處理方面有密切不可分的關系
- var fs = require(‘fs’);
function copy( src, dest ){
? ? fs.writeFileSync( dest, fs.readFileSync(src) );
}
copy(‘data.son’, ‘dataStream.json’); - 上面是一個對文件拷貝的代碼,看似沒什么問題,也的確在處理小文件的時候沒什么大問題,但是一旦處理數量級很大的文件的時候可以看出,先將數據讀取出來,在寫入,內存作為中轉,如果文件太大就會產生問題。
- 如果是大文件就得使用file system的另外幾個API,createReadStream和fs.createWriteStream,將文件作為一塊一塊小的數據流進行處理,而不是一整塊大型數據
- // 也可能出現內存爆倉 寫入數據跟不上讀取速度 一直讀取的文件不斷放入內存中
// 但是兩個操作速度絕對是不一樣的,于是未被寫入的數據在內存中不斷變大,就可能會導致內存的爆倉。
var fs = require(‘fs’);
var rs = fs.createReadStream(‘data.son’);
var ws = fs.createWriteStream(‘dataStream.json’)
rs.on(‘data’,function(chunk){
? ? console.log(‘data chunk read ok’);
? ? times++;
? ? ws.write(chunk,function(){
? ? ? ? console.log(‘data chunk write ok’);
? ? });
});
rs.on(‘end’,function(){
? ? console.log(times);
}); - 可以先寫一個129k的文件
- var fs = require(“fs”);
fs.writeFile(“128k.txt”,new Buffer(129 * 1024));
- 對于這種情況 node里面有一個pipe的方法 連接兩個數據流,猶如導管一樣將數據讀入寫入
- function copy( src, dest ){
? ? fs.createReadStream( src ).pipe( fs.createWriteStream( dest ) );
}
copy(‘data.son’, ‘dataStream.json’);
- path
- normalize:規范化字符串路徑
- console.log(path.normalize(“./../a///b/c/.././d//“));
- __dirname
- join 將多個參數值字符串結合成一個路徑字符串
- console.log(path.join(__dirname,”a”,”b”,”..”,”c”));
- resolve:把參數解析為一個絕對路徑
* 1.以應用程序的根目錄為起點,根據參數的值解析出一個絕對路徑
* 2. .當前目錄 ..上級目錄
* 3. 普通字符串代表下一級目錄
* 4. 如果沒有下一個參數,返回當前路徑
* 5. /代表盤符的根目錄- console.log(path.resolve(“/test/index.html”));
console.log(path.resolve(‘wwwroot’, ‘static_files/png/‘, ‘../gif/image.gif’));
console.log(path.resolve(“../7.fs/img.js”));
- http模塊深入講解
- http協議講解
- http:超文本傳輸協議,是互聯網使用最廣的一個協議
- http 模塊主要用于搭建 HTTP 服務端和客戶端,使用 HTTP 服務器或客戶端功能必須調用 http 模塊
- http——api講解
- 創建服務器
- var http = require(“http”);
var url = require(“url”);
//創建服務器
//http繼承自tcp
var server = http.createServer(function (req,res) {
? ? var urlstr = req.url;//獲取請求的路徑
? ? var urlMethod = req.method;//獲取請求的方法
? ? /*var urlObj = url.parse(urlstr,true);
? ? console.log(urlObj);*/
? ? //console.log(urlMethod);
? ? res.end(“hello”);
});
server.listen(8080);
- 對請求進行處理
- var server = http.createServer(function (req,res) {
? ? var urlstr = req.url;//獲取請求的路徑
? ? var urlMethod = req.method;//獲取請求的方法
? ? var urlObj = url.parse(urlstr,true);
? ? console.log(urlObj);
? ? console.log(urlMethod);
? ? console.log(req.headers);//獲取請求頭
? ? console.log(req.httpVersion);//獲取http的版本
? ? req.on(“data”, function (chunk) {//獲取POST方式發送過來的數據
? ? ? ? console.log(chunk.toString());//chunk:數據塊
? ? });
? ? /*res.statusCode = 404;//設置返回的狀態碼
? ? res.setHeader(“name”,”tangcaiey”);//設置返回的頭*/
? ? //res.setHeader(,);
? ? res.writeHead(200,{name:”tangcaiye”,pass:”1234”,”Content-Type”:”text/html;charset=utf-8”});
? ? res.write(“hello”);
? ? res.write(“yuk”);
? ? res.end();
});
server.listen(8080);
- 前端發送post請求
- <!DOCTYPE html>
<html lang=“en”>
<head>
? ? <meta charset=“UTF-8”>
? ? <title>這是表單頁的標題</title>
</head>
<body>
<!—
? ? 如果沒有文件的話可以使用application/x-www-form-urlencoded
? ? 但是如果有文件的話一定更要用multipart/form-data
—>
<form action=“/upimg” method=“post” enctype=“multipart/form-data”>
? ? 用戶名: <input type=“text” name=“user”><br>
? ? 密碼: <input type=“password” name=“pass”><br>
? ? 上傳圖片: <input type=“file” name=“file1”><br>
? ? <input type=“submit” value=“提交”>
</form>
</body>
</html>
- 上傳文件的處理
- var http = require(“http”);
var url = require(“url”);
var fs = require(“fs”);
var query string = require(“query string”);
var formidable = require(“formidable”);
//創建服務器
//http繼承自tcp
var server = http.createServer(function (req,res) {
? ? //獲取請求的路徑
? ? var urlObj = url.parse(req.url,true);
? ? var pathname = urlObj.pathname;
? ? if(pathname == “/upimg.html”){
? ? ? ? var rs = fs.createReadStream(“./upimg.html”);
? ? ? ? rs.pipe(res);
? ? }else if(pathname == “/upimg”){
? ? ? ? var form = new formidable.IncomingForm();
? ? ? ? form.parse(req, function (err,fields,files) {
? ? ? ? ? ? //fields->以對象格式返回字段
? ? ? ? ? ? /*console.log(fields);
? ? ? ? ? ? console.log(files);*/
? ? ? ? ? ? //將暫存文件寫入到upload文件目錄中
? ? ? ? ? ? fs.createReadStream(files.file1.path).pipe(fs.createWriteStream(“./upload/“+files.file1.name));
? ? ? ? ? ? res.setHeader(“Content-Type”,”text/html;charset=utf8”);
? ? ? ? ? ? res.write(JSON.stringify(fields));
? ? ? ? ? ? res.end(‘<img src=“/upload/‘+files.file1.name+’”>’);
? ? ? ? });
? ? }else if(pathname != “/favicon.ico”){
? ? ? ? fs.createReadStream(“.”+pathname).pipe(res);
? ? }
});
server.listen(8080);
- http模擬客戶端
- var http = require(“http”);
//request函數允許后臺發布請求,第一個參數是一個對象或者字符串
var options = {
? ? ? ? host: ‘localhost’,
? ? ? ? port: ‘8080’,
? ? ? ? path: ‘/reg’,
? ? ? ? method:”POST”,
? ? ? ? headers:{
? ? ? ? ? ? “Content-Type”:”application/json”
? ? ? ? }
};
/*
* request :發請求
* http.request() 返回一個 http.ClientRequest類的實例。nodejs與javascript、ClientRequest實例是一個可寫流對象。
* 如果需要用POST請求上傳一個文件的話,就將其寫入到ClientRequest對象
* */
var request = http.request(options, function (res) {
? ? console.log(res.statusCode);
? ? //獲取響應回來的內容
? ? res.setEncoding(“utf8”);
? ? res.on(“data”, function (chunk) {
? ? ? ? console.log(chunk);
? ? });
});
request.write(‘{“user”:”tangcaiye”,”pass”:”12345”}’);
request.end();//結束寫請求體,真正向服務器發起請求
轉載于:https://www.cnblogs.com/yuanyingke/p/5982842.html