2.node基礎知識筆記

1.Node.js Buffer(緩衝區)

JavaScript 語言自身只有字符串數據類型,沒有二進制數據類型。javascript

但在處理像TCP流或文件流時,必須使用到二進制數據。所以在 Node.js中,定義了一個 Buffer 類,該類用來建立一個專門存放二進制數據的緩存區。php

  • 實例化html

    • Buffer.from(array)java

    • Buffer.from(string)node

    • Buffer.alloc(size)linux

  • 功能方法(靜態方法:經過類名調用.)web

    • Buffer.isEncoding() 判斷是否支持該編碼ajax

    • Buffer.isBuffer() 判斷是否爲Bufferexpress

    • Buffer.byteLength() 返回指定編碼的字節長度,默認utf8npm

    • Buffer.concat() 將一組Buffer對象合併爲一個Buffer對象

  • 實例方法

    • write() 向buffer對象中寫入內容

    • slice() 截取新的buffer對象

    • toString() 把buf對象轉成字符串

    • toJSON() 把buf對象轉成json形式的字符串:

      不須要顯式調用,當JSON.stringify()方法調用時會自動調用toJSON方法。

      let buf=Buffer.from('hello');
      let json=JSON.stringify(buf);
      console.log(json);

2.核心模塊API

先引入路徑模塊:

const path=require('path');

1. 路徑操做:
  • [path.basename(path, ext]):返回文件名稱

  • path.dirname(path):返回路徑

  • path.extname(path):返回擴展名

  • path.format(pathObject):將一個pathObject轉化爲一個字符串路徑

  • path.parse(path):將一個字符串路徑轉化爲路徑對象

  • path.isAbsolute(path):判斷是否爲一個絕對路徑。

(2)blobal超全局對象下的兩個方法:

  • __dirname:返回當前文件所在位置的目錄;

  • __filename:返回當前文件所在位置的全路徑.

 


  1. // 拼接路徑(..表示上層路徑;.表示當前路徑),在鏈接路徑的時候會格式化路徑
    // console.log(path.join('/foo', 'bar', 'baz/asdf', 'quux', '../../'));

    // 規範化路徑
    // console.log(path.normalize('/foo/bar//baz/asdf/quux/..'));
    // console.log(path.normalize('C:\\temp\\\\foo\\bar\\..\\'));

    // 計算相對路徑
    // console.log(path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'));
    // console.log(path.relative('C:\\orandea\\test\\aaa', 'C:\\orandea\\impl\\bbb'));

    // 解析路徑
    // console.log(path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif'));

    // 兩個特殊屬性
    console.log(path.delimiter);//表示路徑分隔符(windows是\ Linux是/)
    console.log(path.sep);//環境變量分隔符(windows中使用; linux中使用:)
  2. 異步與同步:

    因而,全部任務能夠分紅兩種,一種是同步任務(synchronous),另外一種是異步任務(asynchronous)。同步任務指的是,在主線程上排隊執行的任務,只有前一個任務執行完畢,才能執行後一個任務;異步任務指的是,不進入主線程、而進入"任務隊列"(task queue)的任務,只有等主線程任務執行完畢,"任務隊列"開始通知主線程,請求執行任務,該任務纔會進入主線程執行。

    js在瀏覽器中執行存在的異步操做: 定時任務 事件處理 ajax回調處理。

    node.js 中的異步執行任務:文件I/O 網絡I/O

2.文件操做:
  1. 引入模塊: const fs=require('fs');

  2. fs.stat(param1,param2)

    param1:文件路徑 param2: 回調函數 ( err,stats)兩個參數都爲對象,stats.isDirectory:判斷是否爲路徑

    stats.isFile:判斷是否爲文件。 屬性:ctime:文件狀態發生改變時間,如權限 mtime:數據改變時間 atime:訪問時間 birthtime:文件創造時間。

return null3.readFile()和writeFile();


/*讀文件操做*/
const fs=require('fs');
const path=require('path');
let strpath=path.join(__dirname,'data.json');
/*異步方式*/
fs.readFile(strpath,(err,data)=>{
    if(err) return;
    console.log(data.toString());
});
/*同步方式*/
console.log(fs.readFileSync(strpath).toString());
/*寫文件操做*/
let buf=Buffer.from('hello');
fs.writeFile(strpath,buf,'utf8',(err)=>{
      if(!err){
      console.log('寫入成功');
      }
})

4.大文件的流式操做:


/*大文件的流式操做*/
const path=require('path');
const fs =require('fs');

let spath =path.join(__filename);
let endPath=path.join('C:\\Users\\Administrator\\Desktop','file.js');
let readStream=fs.createReadStream(spath);
let writeStream=fs.createWriteStream(endPath);
/*基於事件的處理方式*/
/*let num=0;
chunk:數據塊
readStream.on('data',(chunk)=>{
num++;
writeStream.write(chunk);
});
readStream.on('end',()=>{
console.log('文件處理完成'+num);
});
*/
// pipe():直接將輸入流鏈接到輸出流 pipe:管道
readStream.pipe(writeStream);
3.目錄結構:

/*目錄操做*/
const path=require('path');
const fs=require('fs');

/*建立目錄*/
// fs.mkdir(path.join(__dirname,'abc'),(err)=>{
//   console.log(err);
// });
/*同步建立目錄*/
// fs.mkdirSync(path.join(__dirname,'def'));

/*刪除目錄*/
// fs.rmdir(path.join(__dirname,'def'),(err)=>{})

//讀取目錄
fs.readdir(__dirname,(err,files)=>{
files.forEach((item,index)=>{
fs.stat(path.join(__dirname,item),(err,stat)=>{
if(stat.isFile()){
console.log(item+"文件");
}else if(stat.isDirectory()){
console.log(item+"目錄");
}
});
});
});
4.包:
  1. npm: node.js package management (全球最大的模塊生態系統,也是node.js的包管理工具。)

  2. npm全局安裝(安裝包在node.js環境的modules目錄下,通常用於命令行工具)

    • 安裝包: npm install -g 包名稱@版本 (全局安裝) 本地安裝則不須要 參數 g

    • 更新包 npm update 包名稱

    • 刪除包: npm uninstall 包名稱

    • npm清除緩存:pm cache clean --force

3.npm本地安裝:

​ 初始化包 npm init -y (1) 運行 node (2)指定pakage.json中test值 npm run test 執行

  • 添加依賴 : 開發環境 安裝包的同時 末尾加上 --save

  • 生產環境:安裝包的同時 末尾加上 --save-dev

  • 已有package.json中的dependencies 安裝直接 npm install production

    已有DevDependencies 安裝直接 npm install

4.yarn工具的安裝:


​ yarn工具基本使用


安裝yarn工具:npm install -g yarn

一、初始化包
npm init
yarn init
二、安裝包
npm install xxx --save
yarn add xxx
三、移除包
npm uninstall xxx
yarn remove xxx
四、更新包
npm update xxx
yarn upgrade xxx
五、安裝開發依賴的包
npm install xxx --save-dev
yarn add xxx --dev
六、全局安裝
npm install -g xxx
yarn global add xxx
七、設置下載鏡像的地址
npm config set registry url
yarn config set registry url
八、安裝全部依賴
npm install
yarn install
九、執行包
npm run
yarn run

5.自定義包:

若是嚴格按照規範來講 包目錄應包含如下文件或目錄

  • package.json:包描述文件

  • bin:存放可執行二進制文件的目錄

  • lib:存放js代碼的目錄

  • doc:存放文檔的目錄

  • test:存放單元測試用例代碼的目錄

5.node.js實現簡單服務器:

(1)區別:


傳統的動態網站開發須要應用軟件
PHP : Apache + php模塊
java :Tomcat 、Weblogic
Node.js : 不須要應用軟件(能夠本身實現)

(2)


/*簡單實現服務器功能*/
const http=require('http');

// 建立服務器實例對象
let server=http.createServer();
/*綁定請求事件*/
server.on('request',(req,res)=>{
res.end('hello');
});
// 監聽端口號
server.listen(3000);
// 簡單寫法:
http.createServer((req,res)=>{
  res.end('welcome to this');
}).listen(3000,'192.168.229.1',()=>{
console.log('running...');
});


- 處理get方式請求參數:

- ```javascript
  • 處理get請求方式參數:


    (1) const url=require('url');
    (2) let param=url.parse(req.url,true).query

  • 處理post方式參數:

    1. const querystring = require('querystring');


    2. let pdata='';
      req.on('data',(chunk)=>{
         pdata+=chunk;
      });
      req.on('end',()=>{
         //定義一個存放post發送請求請求體內容的對象。
         let obj=querystring.parse(pdata);
      })

 

  1. art-template的使用:


    /*art-template的使用*/

    var template = require('art-template');
    /*第一種使用方法*/
    /*var html = template(__dirname + '/mytpl.art', {
      user: {
          name: '汪龍',
          age:'18',
          hometown:"lantian"
      }
    });

    console.log(html);*/
    /*方法2*/
    let tpl =`{{if user}}
     <h2>{{user.name}}</h2>
     <h2>{{user.age}}</h2>
     <h2>{{user.hometown}}</h2>
    {{/if}}'`;
    let tpl2=`
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>成績結果</title>
    </head>
    <body>
    <ul>
    <li>語文:{{chinese}}</li>
    <li>數學:{{math}}</li>
    <li>英語:{{english}}</li>
    <li>綜合:{{summary}}</li>
    </ul>
    </body>
    </html>`;
    let render=template.compile(tpl);

    let ret=render({
    user: {
           name: '汪龍',
           age:'18',
           hometown:"lantian"
      }
    });
    console.log(ret);
    // 方法3
    let score= template.render(tpl2,{
    chinese:'148',
    math:'149',
    english:'139',
    summary:'289'
    } );
    console.log(score);
  • node.js web開發相關內容總結:


    1.nodejs不須要第三方軟件,能夠本身實現服務器功能。
    2.實現靜態資源分配
    3.路由處理
    4.動態網站
    5.模板引擎
    6.get和post參數處理

    web開發框架:express.
6.express框架:
  • 實現簡單服務器測試


    /*express測試*/
    const express=require('express');
    const app=express();

    let server=app.get('/',(req,res)=>{
    res.send('hello world');
    });
    server.listen(3000,'localhost',()=>{
    console.log('running...');
    });
  • 靜態文件託管:


/*託管靜態文件*/
// 能夠指定虛擬目錄
// 能夠指定多個目錄
var express = require('express');
var app = express();

app.use(express.static('public'));
app.use(express.static('www'));
app.listen(3000,()=>{
console.log('running....');
});
  • 路由處理:


    /*路由(根據請求方式和請求路徑進行路徑分發處理)*/
    /*
    http經常使用請求方式:
    1.get 查詢
    2.post 添加
    3. put 更新
    4. delete 刪除
    restful api(一種url格式)
    */
    const express=require('express');
    const app=express();
    /*四種基本的路由請求方式*/
    /*app.get('/',(req,res)=>{
    res.send('get data');
    });
    app.post('/',(req,res)=>{
    res.send('post data');
    });
    app.put('/',(req,res)=>{
    res.send('put data');
    });
    app.delete('/',(req,res)=>{
    res.send('delete data');
    });*/
    // 直接使用use能夠處理全部的路由請求分發
    app.use('/',(req,res)=>{
     res.send('hello');
    });
    app.listen(3000,()=>{
    console.log('running....');
    });
  • 中間件(就是處理過程當中的一個環節(本質上至關於一個函數)):

​ // 中間件的掛載方式// use 路由(get post put delete);// next('route');跳轉到下一路由


const express=require('express');
const app=express();
let acessNum=0;
//監聽全部路徑
app.use('',(req,res,next)=>{
/*記錄訪問時間*/
console.log('哈哈,你怎麼又來看我了');
next()
});
app.use('/user',(req,res,next)=>{
/*記錄訪問時間*/
console.log(Date.now());
next()
});
app.use('/user',(req,res,next)=>{
/*記錄訪問日誌*/
console.log('welcome to this');
next()
});
app.use('/user',(req,res)=>{
/*記錄訪問次數*/
acessNum++;
console.log('訪問量:'+acessNum);
res.send('hello');

});
  • 應用中間件:


    //登陸驗證
    /*中間件的應用,第3方中間件,body-parse的使用*/
    const express=require('express');
    const app=express();
    const bodyParser = require('body-parser');
    // 託管靜態資源
    app.use(express.static('public'));
    // 處理get請求方式參數

    //掛載body-parser中間件
    app.use(bodyParser.urlencoded({ extended: false }));
    //當data爲json格式的時候須要加載下面代碼
    //app.use(bodyParser.json())
    app.get('/login',(req,res)=>{
    // 經過req.query屬性得到get方式參數
         let data=req.query;
           if(data.username=='admin'&&data.password=='123'){
          res.send('success');
          }else{
          res.send('failure');
          }
       
    });
    //處理post請求、
    app.post('/login',(req,res)=>{
    let data=req.body;
    console.log(data);
     if(data.username=='admin'&&data.password=='123'){
          res.send('success');
          }else{
          res.send('failure');
          }
     
    });
    app.listen(3000,()=>{
    console.log('running....');
    });
  • express中使用art-template模板:

    1.安裝包:


    npm install --save art-template
    npm install --save express-art-template

    2.使用:


    // 設置模板的路徑
    app.set('views',path.join(__dirname,'views'));
    // 設置模板引擎
    app.set('view engine','art');
    // 使express兼容art-template模板引擎
    app.engine('art', require('express-art-template'));
    // 參數一:模板名稱;參數二:渲染模板的數據
       res.render('list',data);

相關文章
相關標籤/搜索