nodejs與javascript,nodejs(二)

 2023-12-06 阅读 26 评论 0

摘要: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”);
          • 事件
            • 注冊事件
              • on
              • addListener
              • once
            • 發射事件
              • emit
            • 其他方法
              • 設置最大的監聽數量
                • girl.setMaxListeners(2);
              • 移除掉單個事件
                • 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
          • 文件操作
            • 讀取文件
              • readFile
              • readFileSync
            • 寫入文件
              • writeFile
                • 第一個參數為寫入的文件名
                • 第二個為寫入寫入的文件內容
                • 第三個為配置參數
                  • {? ? flag:”a”}
                    • a:追加
                    • w:寫入
                    • r:讀取
                • 第四個為回調
                • 代碼:
                  • 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

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/5/192002.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息