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與sessionCookie: 瀏覽器在電腦硬碟中開闢的一塊空間,主要供伺服器端存儲數據
cookie中的數據是有過期時間的,超過時間數據會被瀏覽器自動刪除cookie中的數據會隨著請求被自動發送到伺服器端Session: 實際上就是一個對象,存儲在伺服器端的內存中,在session對象中也可以存儲多條數據,每一條數據都有一個sessionID做為唯一標識
在node,js中需要藉助express-session實現session功能
const session = require('express-session');
app.use(session({ secret: 'secret key' }));
JoiJavaScript對象的規則描述語言和驗證器
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-pageconst 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存儲上傳的文件信息
});
文件讀取 FileReaderconst reader = new FileReader();
reader.readAsDataURL('文件');
reader.onload = function () {
console.log(reader.result)
};
mongoDB資料庫添加帳號啟動MongoDB服務 net start mongodbmongoose.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模塊查找系統環境變量,並讀取其值作為當前配置項屬於的值