1. 程式人生 > 其它 >Node.js-模組化/包/express路由

Node.js-模組化/包/express路由

模組化

提高程式碼的複用性,可維護性,實現按需載入   Node.js根據模組的來源不同,分為三類 內建模組:fs,path,http 自定義模組:使用者自己建立的 第三方模組:需要下載的   載入模組 使用require() 注:載入自定義模組,需要注意路徑問題   模組作用域:只能在該模組使用定義在該模組中的變數 好處:防止全域性變數汙染的問題   向外共享模組作用域中的成員 設定一個自定義模組
module.exports.username = 'zs';
module.exports.sayhello = function () {
    console.log('hello');
}

設定測試

//在外界使用require倒入一個自定義模組的時候,得到的成員便是module.exports所指向的物件
const m = require('/Users/shuchenhao/Desktop/web前端學習/Node/自定義模組.js');
console.log(m);
終端顯示結果 shuchenhao@shuchenhaodeMacBook-Air Node % node test1.js { username: 'zs', sayhello: [Function (anonymous)] }

共享成員的注意點

使用require()方法匯入模組時,匯入的結果,永遠以module.exports指向的物件為準。
module.exports.username = 'zs';
module.exports.sayhello 
= function () { console.log('hello'); } module.exports = { nickname: '小黑', sayhi() { console.log('hi'); } }
終端 shuchenhao@shuchenhaodeMacBook-Air Node % node test1.js { nickname: '小黑', sayhi: [Function: sayhi] }   exports和module.exports指向同一個物件,最終共享的結果永遠以module.exports指向的物件為  

第三方模組也稱為包 從https://www.npmjs.com網站上搜索自己需要的包   通過匯入moment包,使用高階操作對時間進行格式化 匯入moment包的命令:npm install moment
//匯入moment名稱
const moment = require('moment');
const dt = moment().format('yyyy-mm-dd hh:mm:ss');
console.log(dt);
如何安裝指定的版本號的包 Npm install [email protected] 同時最新的命令去安裝包會覆蓋之前安裝的包   解決下包速度慢的問題 切換npm的下包映象源 shuchenhao@shuchenhaodeMacBook-Air Node % npm config get registry https://registry.npmjs.org/ shuchenhao@shuchenhaodeMacBook-Air Node % npm config set registry=https://registry.npm.taobao.org/ shuchenhao@shuchenhaodeMacBook-Air Node % npm config get registry                                  https://registry.npm.taobao.org/    

包的分類

專案包 開發依賴包:被記錄到devDependencies節點中的包,只在開發期間會用到 核心依賴包:被記錄到dependencies節點中的包,在開發期間和專案上線之後都會用到   全域性包:在執行安裝命令的時候,如果提供-g引數,  

開發自己的包

首先建立一個資料夾包含以下檔案

 

在package.json中,存放版本,名稱等內容

{
    "name": "ith-tools",
    "version": "1.2.0",
    "main": "index.js",
    "description": "提供了格式化時間,HTMLEscape相關功能",
    "keywords": [
        "ith",
        "dateFormat",
        "escape"
    ],
    "license": "ISC"
}

在index.js中存放

//包的入口
const date = require('./dataformat.js')
const escape = require('./htmlEscape.js')

module.exports = {
    ...date,
    ...escape
}

在dataformat.js用於存放時間格式化的模組

//時間格式化
function dataformat(datastr) {
    const dt = new Date(datastr);
    const y = padZero(dt.getFullYear());
    const m = padZero(dt.getMonth() + 1);
    const d = padZero(dt.getDate());
    const hh = padZero(dt.getHours());
    const mm = padZero(dt.getMinutes());
    const ss = padZero(dt.getSeconds());
    return y + '-' + m + '-' + d + ' ' + hh + ':' + mm + ':' + ss;


}
//定義補0函式
function padZero(n) {
    return n > 9 ? n : '0' + n;

}

module.exports = {
    dataformat
}

在htmlEscape中存放轉義html字元的函式模組

//定義轉義HTML字元的函式
function htmlEscape(htmlstr) {
    return htmlstr.replace(/<|>|"|&/g, (match) => {
        switch (match) {
            case '<': return '&lt;';
            case '>': return '&gt;';
            case '"': return '&quot;';
            case '&': return '&amp;';
        }

    });
};
//定義還原HTML字串的函式
function htmlUnEscape(str) {
    return str.replace(/&lt;|&gt;|&quot;|&amp;/g, (match) => {
        switch (match) {
            case '&lt;': return '<';
            case '&gt;': return '>';
            case '&quot;': return '"';
            case '&amp;': return '&';
        }

    });
};


module.exports = {
    htmlEscape,
    htmlUnEscape
}

在readme中存放介紹

##安裝
‘’‘
npm install ith-tools
'''

##匯入
‘’‘js
const itheima=require('ith-tools')
'''

##格式化時間
‘’‘js
//呼叫dateformat格式化時間
const newTIME = itheima.dataformat(new Date());
console.log(newTIME);
'''

##轉義html中的特殊字元
‘’‘js
//帶轉換的字串
const htmlstr = '<h1 title="abc">這是目標標籤<span>123&nbsp;</span></h1>';
//呼叫htmlEscape方法進行轉換
const str = itheima.htmlEscape(htmlstr);
console.log(str);
‘’‘

##還原html中的特殊字串
’‘’js
//帶還原的html字串
const str2 = itheima.htmlUnEscape(str);
console.log(str2);
‘’‘

開源協議
ISC

然後釋出過程如下

1.註冊npm賬號 2.終端中登陸npm shuchenhao@shuchenhaodeMacBook-Air Node % npm login npm notice Log in on https://registry.npmjs.org/ Username: shuchenhao Password:  Email: (this IS public) [email protected] npm notice Please check your email for a one-time password (OTP) Enter one-time password: 08342327 Logged in as shuchenhao on https://registry.npmjs.org/.   3.切換到釋出包資料夾下面輸入釋出命令 npm publish  

模組的載入機制

 內建模組是由官方提供的模組,內建模組的載入優先順序最高。    

Express

基於node.js平臺,快速、開放、極簡的web開發框架 4.17.1版本   Express基於http模組封裝出來的,提高開發效率 常見兩種伺服器 Web網站伺服器:對外提供web網頁資源的伺服器  API介面伺服器:對外聽過API介面的伺服器 使用express,可以方便快速建立web網站伺服器和API介面伺服器     安裝express npm install express   建立一個基本的web伺服器
//匯入
const express = require('express');
//建立web伺服器
const app = express();
//監聽get請求
app.get('/user', (req, res) => {
    res.send({ name: 'ss', age: 20 });
});
app.post('/user', (req, res) => {
    res.send('請求成功');
})
//  啟動
app.listen(80, () => {
    console.log('express running at http://127.0.0.1');
})
 終端執行伺服器之後,通過postman進行介面測試 監聽get請求

 

監聽post請求

 

獲取URL中帶的引數

app.get('/', (req, res) => {
    //通過req.query可以獲取到客戶端傳送過來的查詢引數
    //預設情況下req.query是空物件
    console.log(req.query);
    res.send(req.query);
})

在query params中輸入key和value,點選send,則可以在終端中獲取URL中所帶的引數

 

 

shuchenhao@shuchenhaodeMacBook-Air Node % node 使用express建立伺服器.js express running at http://127.0.0.1 {} { name: 'ss', age: '10’ }

獲取URL中的動態引數

//這裡的:id是個動態引數
app.get('/user/:id', (req, res) => {
    //動態匹配的URL引數,預設的也是一個空物件
    console.log(req.params);
    res.send(req.params)
})

在user/之後不管輸入幾,都是動態獲取到Id的值

 

終端結果 shuchenhao@shuchenhaodeMacBook-Air Node % node 使用express建立伺服器.js express running at http://127.0.0.1 { id: '1’ }   可以設定多個動態引數
app.get('/user/:id/:name', (req, res) => {
    //動態匹配的URL引數,預設的也是一個空物件
    console.log(req.params);
    res.send(req.params)
})

 

shuchenhao@shuchenhaodeMacBook-Air Node % node 使用express建立伺服器.js express running at http://127.0.0.1 { id: '3', name: 'sch' }

託管靜態資源

通過express.static(),可以建立一個靜態資源伺服器, 如下,可以將public目錄下的圖片、css檔案、js檔案對外開放訪問 注:express在指定的目錄中查詢檔案,並對外提供資源的訪問路徑,因此,存放靜態檔案的目錄名不會出現在URL中

 

const express = require('express');
const app = express();
//呼叫express.static()方法,快速對外提供靜態資源
app.use(express.static('./anli'));
app.listen(80, () => {
    console.log('express running at http://127.0.0.1');
})

託管多個靜態資源目錄

多次呼叫express.static()函式 根據目錄的新增的順序查詢所需的檔案。  

掛載路徑字首 

 
app.use('/abc', express.static('./files'));
在網頁中輸出的時候要加上/abc字首  

 Nodemon

 在編寫除錯node.js專案的時候,如果修改了專案的程式碼,則需要頻繁的手動close,然後在重新啟動,nodemon工具可以監聽專案的變動,重新啟動專案。  

Express路由

在express中,路由指客戶端請求和伺服器處理函式之間的對映關係。 Npm init -y初始化一個package.json 包管理配置檔案  

模組化路由

不建議直接吧路由直接掛載在app上,推薦模組化   建立路由模組
//路由模組
const express = require('express');
const router = express.Router();
//掛載具體路由
router.get('/user/list', (re1, res) => {
    res.send('Get user list');
})
router.posy('/user/add', (re1, res) => {
    res.send('Add new user');
})
//匯出路由物件
module.exports = router;

再另一個js檔案中註冊路由

const express = require('express');
const app = express();
//匯入路由模組
const router = require('./模組化路由.js');
//註冊路由模組
app.use(router);

app.listen(80, () => {
    console.log('http://127.0.0.1');
})

為路由庫快新增字首

app.use('/api', router);