Node.js篇-2. Express框架

2021-12-23 雨過天晴後
Express框架簡介及初體驗Express框架是什麼

Express是一個基於Node平臺的Web應用開發程序,它提供了一系列強大特性,幫助你創建各種web應用

我們可以使用 npm install express 命令進行下載

Express框架特性中間件什麼是中間件

中間件就是一堆方法,可以接收客戶端發來的請求,可以對請求做出響應,也可以將請求繼續交給下一個中間件繼續處理


中間件主要由兩部分組成: 中間件方法以及請求處理函數

中間件方法由Express提供,負責攔截請求,請求處理函數由開發人員提供,負責處理請求

app.get('請求路徑','處理函數') //接收並處理get請求

app.post('請求路徑','處理函數') //接收並處理post請求

可以針對同一個請求設置多個中間件,對同一個請求進行多次處理

默認情況下,請求從上到下依次匹配中間件,一旦匹配成功,終止匹配

可以調用next()方法將請求的控制權交給下一個中間件,直到結束請求的中間件

app.get('/request',(req, res, next) => {

    req.name = '張三';

    next();

});

app.get('/request',(req, res) => {

    res.send(req.name);

});

app.use中間件用法

app.ues 匹配所有的請求方式,可以直接傳入請求處理函數,代表接收所有的請求

app.use((req, res, next) => {

    console.log(req.url);

    next();

});

app.use 第一個參數也可以傳入請求地址,代表不論什麼請求方式,只要是這個請求地址就接收這個請求

app.use('/admin', (req, res, next) => {

    console.log(req.url);
 
    next();    

});

中間件應用路由保護,客戶端在訪問需要登錄的頁面時,可以先使用中間件判斷用戶登錄狀態,用戶如果未登錄,則攔截請求,直接響應,禁止用戶進入需要登錄的界面網站維護公告,在所有路由的最上面定義接收所有請求的中間件,直接為客戶端做出響應,網站正在維護中錯誤處理中間件

在程序執行的過程中,不可避免的會出現一些無法預料的錯誤,比如文件讀取失敗,資料庫連接失敗

錯誤處理中間件是一個集中處理錯誤的地方

app.get('/index',(req, res) => {

    throw new Error();

})

// 錯誤中間件

app.use((err, req, res, next) => {

    res.status(500),send(err);

});

當程序出現錯誤時,調用next()方法,並且將錯誤信息通過參數的形式傳遞給next()方法,即可觸發錯誤處理中間件

app.get('/路徑',(req, res) => {

    fs.readFile('路徑', 'utf8', (err, result) => {

        if (err != null) {

            // 觸發錯誤處理中間件

            next(err);

        } else {

            res.send(result);

        }

    })

})

// 錯誤處理中間件

app.use((err, req, res, next) => {

    res.status(500),send(err);

});

捕獲錯誤

在node.js中,異步API的錯誤信息都是通過回調函數獲取的,支持Promise對象的異步API發生錯誤可以通過catch方法捕獲

Try catch 可以捕獲異步函數以及其他同步代碼在執行過程中發生的錯誤,但是不能捕獲其他類型API發生的錯誤

// 增加代碼健壯性

app.get('/', async (req, res, next) => {

    try {

        await User.find({name: '張三'});

    } catch(ex) {

        // 觸發錯誤處理中間件

        next(ex);

    }

});

Express請求處理構建模塊化路由

基礎代碼 :

const express = require('express')

// 創建路由對象

const home = express.Router();

// 將路由和請求路徑進行匹配

app.use('home',home);

// 在home路由下繼續創建路由

home.get('/index', (req, res) => {

    // /home/index

    res.send('歡迎來到博客展示頁面');

});

模塊化路由:

// home.js

const home = express.Router();

home.get('/index', (req, res) => {

    res.send('歡迎來到展示頁面');

})

module.exports = home;

// admin.js

const admin = express.Router();

admin.get('/index', (req, res) => {

    res.send('歡迎來到管理頁面');

})

module.exports = admin;

// app.js

const home = require('./home.js');

const admin = require('./admin.js');



app.use('/home', home);

app.use('/admin', admin);

GET參數的獲取

Express框架中使用req.query即可獲取GET參數,框架內部會將GET參數轉換為對象並返回

// 接收地址欄中問好後面的參數

// 例如: http://localhost:3000/?name=zhangsan&age=20

app.get('/', (req, res) => {

    console.log(req.query)

    // {name: 'zhangsan', age: '20'}

});

POST參數的獲取

Express中接收post請求參數需要藉助第三方包body-parser

// 引入body-parser模塊

const bodyParser = require('body-parser');

// 配置body-parser模塊

// extended: false 方法內部使用querystring模塊處理請求參數的格式

// extended: true方法內部使用qs第三方模塊處理請求參數的格式

app.use(bodyParser.urlencoded({ extend: false }));

// 接收請求

app.post('/add', (req, res) => {

    // 接收請求參數

    console.log(req.body);

})

Express路由參數
// 請求當前路由要傳一個id參數

// localhost:3000/find/123

app.get('/find/:id', (req,res) => {

    

});

靜態資源的處理

通過Express內置的express.static可以方便的託管靜態文件,例如img,css,JavaScript文件等

app.use(express.static('路徑'));

express-art-template模板引擎模板引擎為了使art-template模板引擎能夠更好地和Express框架配合,模板引擎官方在原art-template模板引擎的基礎上封裝了Express-art-template使用npm install art-template express-art-template命令進行安裝
// 渲染後綴為art的模板時,使用express-art-template

app.engine('art', require('express-art-template'));

// 設置模板存放目錄

app.set('views', path.join(__dir,'views'));

// 渲染模板時不寫後綴,默認拼接art後綴

app.set('view engine', 'art');

app.get('/', (req, res) => {

    // 渲染模板

    // render方法做了四件事

    // 1. 拼接模板路徑

    // 2. 拼接模板後綴

    // 3. 哪一個模板和哪一個數據進行拼接

    // 4. 將拼接結果響應給客戶端

    res.render('模板名字,可以省略.art', {

        msg: 'message'

    });

});

app.locals對象

將變量設置到app.locals對象下面,這個數據在所有的模板中都可以獲取到

app.locals.users = [{

    name: '張三',

    age: 20

}, {

     name: '李四',

     age: 30   

}]

項目環境搭建項目介紹

多人博客管理系統

案例初始化Npm install express mongoose art-template express-art-template密碼加密 bcrypt

哈希密碼是單程加密方式: 1234 => abcd

在加密的密碼中加入隨機字符串可以增加密碼被破解的難度

// 導入bcrypt模塊

const bcrypt = require('bcrypt');

// 生成隨機字符串 gen => generate 生成salt鹽

let salt = await bcrypt.genSalt(10);

// 使用隨機字符串對密碼進行加密

let pass = await bcrypt.hash('明文密碼', salt);

// 密碼比對

let isEqual = await bcript.compare('明文密碼','加密密碼');

bcrypt依賴的其他環境

npm install -g node-gyp

npm install --global --production windows-build-tools

cookie與session

Cookie: 瀏覽器在電腦硬碟中開闢的一塊空間,主要供伺服器端存儲數據

cookie中的數據是有過期時間的,超過時間數據會被瀏覽器自動刪除cookie中的數據會隨著請求被自動發送到伺服器端

Session: 實際上就是一個對象,存儲在伺服器端的內存中,在session對象中也可以存儲多條數據,每一條數據都有一個sessionID做為唯一標識


在node,js中需要藉助express-session實現session功能

const session = require('express-session');

app.use(session({ secret: 'secret key' }));

Joi

JavaScript對象的規則描述語言和驗證器

const Joi = require('Joi');

const schema = {

    username: Joi.string().alphanum().min(3).max(30).required().error(new Error('錯誤信息')),

    password: Joi.string().regex(/^[a-zA-Z0-9]{3-30}$/),

    access_token: [Joi.string(), Joi.number()],

    birthyear: Joi.number().integer().min(1900).max(2013),

    email: Joi.string.email()

};

Joi.Validate({'驗證對象'},schema); //返回Promise對象

數據分頁第一種方式:

當資料庫中的數據非常多時,數據需要分批次顯示,這時就需要用到數據分頁功能

分頁功能核心要素:

當前頁,用戶通過點擊上一頁或下一頁或者頁碼產生,客戶端通過get參數方式傳遞到伺服器端總頁數,根據總頁數判斷當前頁是否為最後一頁,根據判斷結果做響應操作
limit() // 限制查詢數量 傳入每頁顯示的數據數量

skip() // 跳過多少條數據 傳入顯示數據的開始位置

數據開始位置 = (當前頁-1) * 每頁顯示數據條數

第二種方式 mongoose-sex-page
const pagination = require('mongoose-sex-page');
// page當前頁 size當前頁顯示數據數量 display指定客戶端顯示幾個頁碼 exec向資料庫發送查詢請求
pagination(集合構造函數).page(1).size(20).display(0).exec();

Formidable

作用: 解析表單,支持get請求參數, post請求參數, 文件上傳

// 引入表單模塊

const formidable = require('formidable');

// 創建表單解析對象

const form = new formidable.IncomingForm();

// 設置文件上傳路徑

form.uploadDir('路徑');

// 保留表單上傳文件的擴展名

form.keppExtensions = true;

// 對表單進行解析

form.parse(req, (err,fields,files) => {

    // fields存儲普通請求參數

    // files存儲上傳的文件信息

});

文件讀取 FileReader
const reader = new FileReader();

reader.readAsDataURL('文件');

reader.onload = function () {

    console.log(reader.result)

};

mongoDB資料庫添加帳號啟動MongoDB服務 net start mongodb

mongoose.connect('mongodb://user:pass@localhost:port/database')

開發環境與生產環境

環境,就是指項目運行的地方,當項目處於開發階段,項目運行在開發人員的電腦上,項目所處的環境就是開發環境.當項目開發完成以後,要將項目放到真實的網站伺服器電腦中運行,項目所處的環境就是生產環境

因為在不同的環境中,項目的配置是不一樣的,需要在項目代碼中判斷當前項目運行的環境,根據不同的環境應用不同的項目配置.

通過電腦作業系統中的系統環境變量區分當前是開發環境還是生產環境


if (process.env.NODE_ENV == 'development') {

    // 開發環境

} else {

    // 生產環境

}

第三方模塊config

作用:允許開發人員將不同運行環境下的應用配置信息抽離到單獨的文件中,模塊內部自動判斷當前應用的運行環境,並讀取對應的配置信息,極大提供應用配置信息的維護成本,避免了當運行環境重複的多次切換時,手動到項目代碼中修改配置信息

Npm install config 命令下載模塊在config文件夾下面新建default.json, development.josn, production.json文件在config文件夾中建立custom-environment-variables.json項目運行時config模塊查找系統環境變量,並讀取其值作為當前配置項屬於的值

相關焦點

  • Node.js 框架 express 4.X API 中文手冊【express()篇】
    點擊上方藍色【一燈科技】,即可關注我們的公共號啦,吼吼~原創作者:波多馬克河畔,京程一燈特邀作者波多馬克河畔,留學海外對編程充滿熱情的高中生寫過 node.js
  • 【Node.js系列】Express 介紹
    Express 框架根據官方的介紹,Express 是一個基於 Node.js 平臺的極簡、靈活的 web 應用開發框架,可以輕鬆的創建各種 web
  • 阿里雲主機Nginx下配置NodeJS、Express和Forever
    二、安裝NodeJSNodejS目前最新穩定版是0.8.9,在阿里雲CentOS6.2環境中,根據以下步驟即可成功安裝:wget http://nodejs.org/dist/v0.8.9/node-v0.8.9.tar.gztar zxvf node-v0.8.9.tar.gzcd node-v0.8.9.
  • Node.js Express 框架核心原理全揭秘
    介紹express框架大家都已經都很熟悉,是NodeJS最流行的輕量web開發框架。他簡單易用,卻功能強大。最近一個月來一直反覆研究調試express框架,深究其源碼不覺為之驚嘆,不論是原理與代碼都非常簡單,很容易理解也很受用,覺得有必要寫個文章分享一下。本系列分2部分全面介紹express。
  • 10 個最好用的 NodeJS 框架
    然而這些框架不會給開發者太多做錯誤決策的空間。讓我們來看看目前可用的最好、最強大的 NodeJS 框架,並幫助你建立實時的、各種規模和複雜性的可擴展 Web 應用程式 -對於一個已經在使用 node.js 的開發人員來說,Express 或者"node.js express"並不是一個新鮮事。
  • 最新Node.js框架:Koa 2 實用入門
    Koa2是目前Node.js世界最火的web框架,無論從性能,還是流程控制上,koa 2和它的後宮(中間件)都是非常好的解決方案。
  • 碼農手記 | node.js後端框架介紹
    有許多框架可以選擇,包括老牌的express,koa,新晉的egg,nest等等。Express 是一款基於node.js以及Chrome V8引擎,快速、極簡的JS服務端開發框架Sails 作為一個非常穩固的 nodejs 框架,提供了建立任何規模的 web 應用所需要的所有功能功能。Sails.js 在底層使用了 express 框架來提供對 http 請求的處理,同時使用 Socket.IO 框架來處理WebSocket 請求。
  • 通過express快速搭建一個node服務
    如果你是一個前端程式設計師,不太擅長像PHP、Python或Ruby等動態程式語言,想創建自己的服務,那麼Node.js是一個非常好的選擇。本文將通過幾個簡要步驟,運用express框架,快速搭建一個node服務。一、環境搭建1、新建文件夾,這裡暫時叫做「node-service」。
  • Node.js主流Web框架對比
    Node.js是專注高性能伺服器開發的javascript運行環境。我們將在這篇文章向大家介紹幾款主流Node.js Web框架的特點及優缺點,希望給大家作為參考。主要參考的Node.js Web框架包括:express, koa, hapi, restify, fastify, eggjs, thinkjs, Sails, Adonisjs, NestJS。
  • Node.js+Express 開發之Cookie、Session 使用詳解
    nodejs+express 開發中 cookie 的使用  node.js 的web框架 express 在4.x版本後,許多模塊不再包含在其中,而是需要單獨下載安裝。代碼示例let express = require("express");let session = require("express-session");let app = express();app.use(session({ secret: "nodejs world", resave: false
  • 10 個最適合 Web 和 APP 開發的 NodeJS 框架
    然而這些框架不會給開發者太多做錯誤決策的空間。讓我們來看看目前可用的最好、最強大的 NodeJS 框架,並幫助你建立實時的、各種規模和複雜性的可擴展 Web 應用程式1. Node.js Express對於一個已經在使用 node.js 的開發人員來說,Express 或者」node.js express」並不是一個新鮮事。
  • 10個適合web前端開發的node.js框架
    Node.js ExpressExpress 框架提供了對 node.js 原生 API 的比較好的封裝,從而使開發者更加容易地使用node.js。Express 框架提供了用來開發強壯的 web/移動應用,以及 API 的所有功能。並且開發人員還能夠方便地為它開發插件和擴展,從而增加 Express 的能力。
  • 知名Node.js框架系列之:我看面向特性的Thinkjs
    我看面向特性ThinkjsThinkjs 是一個快速、簡單的基於MVC和面向對象的輕量級Node.js開發框架,遵循MIT協議發布。
  • 入門 node.js 你必須知道的那些事
    /a.js')執行 b.jsnode 中的模塊概念node 中一個模塊就是一個 js 文件,多個模塊組成一個特定功能的一堆文件叫包一個 js 文件可以定義它自己暴露給外部的變量 (意思就是另一個文件通過 require 引用它後需要怎麼使用它),node 中提供共了 exports 和 module.exports 兩個變量來實現它a.js
  • ​Node.js系列十 - express開發web伺服器
    認識Web框架前面我們已經學習了使用http內置模塊來搭建Web伺服器,為什麼還要使用框架?有URL判斷、Method判斷、參數處理、邏輯代碼處理等,都需要我們自己來處理和封裝;目前在Node中比較流行的Web伺服器框架是express、koa;我們先來學習express,後面再學習koa,並且對他們進行對比;express早於koa出現,並且在Node社區中迅速流行起來
  • JS全棧第一步 - 連接 React 和 Node,Express
    譯註:嚶嚶嚶,我也寫了Demo的… client-react-001 , api-node-001這裡的目標是為您提供有關如何設置和連接前端客戶端和後端API的實用指南。在我們開始之前,確保您的機器上已經安裝了 Node.js創建項目主目錄在終端,導航到你要保存項目的目錄。
  • 用 Express.js 和 Heroku 部署 Web 應用
    Express 是 NodeJS 中廣泛使用的伺服器框架。$ npm install express --save終於可以開始寫代碼了!也就是說,啟動應用程式需要使用以下命令:$ node app.js但首先,你需要在你的文件裡寫一些代碼。編輯 app.js 的內容用你喜歡的編輯器打開 app.js,編寫下面的代碼,然後保存。
  • 國內 Node.js 2015 總結
    庫Mabolo: 輕量級的 MongoDB ORM一個自用的極簡 ORM,帶三方緩存支持——ToshihikoA Much Better Pomelo Game Server Framework (網易Pomelo框架深度優化版)Nodejs Web框架Thinkjs第一個全面支持使用 ES6/7 特性開發的 Node.js 框架
  • CentOS安裝NodeJS及Express開發框架
    本文演示在Linux上安裝NodeJS及Express開發框架 nodejs和mongodb的更新速度太快。
  • 無涯教程:Node.js - Express RESTFul API
    收錄於話題 #nodejs, "user2":{ "name":"suresh", "password":"password2", "profession":"librarian", "id":2 }, "user3":{ "name":"ramesh",