哈希加密bcrypt和cookie和session和joi 和``formidable``FileReader
哈希加密bcrypt和cookie和session和joi 和``formidable``FileReader
1.哈希加密bcrypt
1.密碼加密
哈希加密是單程加密方式:
1234=>abcd
;
在加密密碼中加入随機字元串可以增加密碼被破解的難度;
//導入bcrypt子產品
const bcrypt = require('bcrypt');
//生成随機字元串 gen=>generate 生成salt 鹽
// genSalt方法接收一個數值作為參數
// 數值越大 生成的随機字元串複雜度越高
// 數值越小 生成的随機字元串複雜度越低
// 預設值是 10
// 傳回生成的随機字元串
let salt = await bcrypt.genSalt(10);
//使随機字元串對密碼進行加密
// 1. 要進行加密的明文
// 2. 随機字元串
// 傳回值是加密後的密碼
let pass = await bcrypt.hash('明文密碼',salt);
bcrypt 依賴的其他環境
- python 2.x
- node-gyp npm install -g node-gyp
- windows-build-tools
- npm install --global --production windows-build-tools
2.密碼對比
// 密碼比對
let result = await bcrypt.compare('明文密碼', '加密密碼');
2.cookie和session
cookie:浏覽器在電腦硬碟中開辟一塊空間,主要供伺服器端存儲資料;
1.cookie中的資料是以域名的形式進行差別的;
2.cookie中的資料是有過期時間的,超過時間資料會被浏覽器自動删除;
3.cookie中的資料會随着請求被自動發送到伺服器端;
session:實際上就是一個對象,存儲在伺服器的記憶體中,在session對象中也可以存儲多條資料,每一條資料都有一個sessionid作為唯一辨別;
在node中使用express-session 子產品中實作session功能
// 導入express-session子產品
const session = require('express-session');
// 配置session
app.use(session({
secret: 'secret key',
resave:false,
saveUninitialized: false,
cookie:{
//maxAge接收一個毫秒,從目前時間起,加上設定的時間,如果超過設定的時間,就删除
maxAge:24*60*60*1000
}
}))
從使用者頁面從session中擷取資料
// 建立使用者清單路由
admin.get('/user',(req,res)=>{
res.render('admin/user',{
//在渲染頁面中使用模闆拼接使用者名,在頁面中顯示
msg:req.session.username
})
})
//将使用者名存儲在請求對象中
//通過請求對象req下邊的session對象存儲,是express-session子產品添加的方法
//這樣就可以向session對象裡邊存儲一些資料,在内部自動生成一個唯一的sessionid,并且把sessionis存儲到用戶端的cookie中
req.session.username = user.username;
3.joi (javaScript對象的規則描述語言和驗證器)
安裝第三方包 npm install joi
//引入joi子產品
const joi = require('joi');
//定義對象的驗證規則
const schema = {
username:joi.string().min(2).max(5).required().error(new Error('username屬性沒有通過驗證')),
birth:joi.number().min(1900).max(2020).error(new Error('birth沒有通過驗證'))
};
async function run(){
try {
//驗證
await joi.validate({username:'ab',birth:1901},schema);
}
catch(ex){
console.log(ex.message);
return;
}
console.log('驗證通過');
}
run();
4. formidable
formidable
作用:解析表單,post請求,檔案上傳;
安裝 npm i formidable
//1.建立表單解析對象
const form = new formidable.IncomingForm();
//2.配置上傳檔案的存放路徑 使用絕對路徑
form.uploadDir = path.join(__dirname,'../','../','public','uploads');
//上傳的檔案要保留字尾
form.keepExtensions = true;
//4.解析表單
form.parse(req,async(err,fields,files)=>{
//1.err是錯誤對象,如果表單解析失敗,err裡邊存儲的是錯誤資訊,如果表單解析成功,err将會是null
//2.fields對象類型,儲存表單資料相當于border-parser 解析post請求資料
// 3.files 對象類型 儲存了和上傳檔案相關的資料
//使用的時候可以列印出來
})
5. FileReader
FileReader
前端上傳檔案資料控件
//擷取檔案元素
var file = document.querySelector('#file');
//擷取img元素
var preview = document.querySelector('#preview');
file.onchange = function(){
// 1.建立檔案讀取對象
var reader = new FileReader();
// 使用者選擇的檔案清單 很多檔案
// console.log(this.files[0]);
//2.讀取檔案 異步函數,暫時不能拿到傳回值
reader.readAsDataURL(this.files[0]);
// 3.監聽onlod事件 在檔案讀取對象下邊
reader.onload = function(){
//擷取讀檔案的結果 reader.result
// console.log(reader.result);
//将讀取檔案的結果顯示在頁面中
preview.src = reader.result;
}
}
6.資料分頁
//導入分頁子產品
const pagination = require('mongoose-sex-page');
// 從資料庫中查詢資料
let result = await pagination(Article).page(page).size(4).display(5).find().populate('author').exec();