項目經(jīng)驗:
fs.unlinkSync(path)? path 網(wǎng)絡(luò)路徑
multer:
不可做全局中間件使用
reg:
用戶存在時,是否可以拒絕文件
multer 如果單獨使用在reg路由里面
mongodb的id 查詢
let ObjectID = mongodb.ObjectID
_id : ObjectID(id)
密碼加密: bcrypt
加密: var hash = bcrypt.hashSync(用戶傳過來的明文密碼, 加鹽數(shù));
校驗:? bcrypt.compareSync(用戶傳過來的明文密碼, hash); // true|false
https://www.easyapi.com 在線api文檔
大后端渲染:
用戶 - > 地址欄(http[s]請求) -> web服務(wù)器(收到) - > nodejs處理請求(返回靜態(tài)、動態(tài))->請求數(shù)據(jù)庫服務(wù)(返回結(jié)果)->nodejs(接收)->node渲染頁面->瀏覽器(接收頁面,完成最終渲染)
模板引擎:
前端: dom操作 虛擬dom操作 二次渲染,后期多次渲染, 優(yōu)點:局部渲染
? jq/js/angualrJs vue/react/.......? 渲染頁面(數(shù)據(jù)整合到靜態(tài)頁面)
后端:
? 抓取前端靜態(tài)頁面 + 渲染引擎 + 數(shù)據(jù)? 返回data ->? send(data)
? 渲染引擎: jade / ejs / ....
arttemplate? underscore baiduTemplate mustach .......
ejs: 模板渲染是異步的
res.render('html轉(zhuǎn)換的ejs模板',{數(shù)據(jù)})
data == str?
ejs模板 : 后綴名為ejs的html文件
ejs模板語法:
ejs 結(jié)構(gòu)就是html
輸出: <%= 數(shù)據(jù)名|屬性名|變量名 + 表達式 %>
語句: <% 語句 %>? 需要被<%? %>? 包裹
非轉(zhuǎn)義輸出: <%- 數(shù)據(jù)名|變量名? + 表達式 %>
https://www.npmjs.com/package/ejs
代理:
接口文檔: https://www.cnblogs.com/e-cat/p/8656040.html
豆瓣:
hostname:'douban.uieee.com',//主機名
? ? port: 443,//端口
? ? path:'/v2/movie/top250?start=3&count=1',
? ? method:'get'
數(shù)據(jù)代理proxy: request請求 抓取異步數(shù)據(jù)
? options={
? ? hostname:'douban.uieee.com',
? ? port:443,
? ? path:'/v2/movie/top250?count='+req.query.count,
? ? method:'GET'
? };
? 發(fā)送http[s]請求
? http[s].request(配置項,回調(diào)(響應(yīng)對象resHttp)) 返回請求對象reqHttp
? resHttp 響應(yīng)對象
? ? resHttp.statusCode 狀態(tài)碼? 200 OK
? ? resHttp.headers 獲取響應(yīng)頭信息
? ? resHttp.setEncoding('utf-8') 設(shè)置編碼方式
? ? resHttp.on('data/end',fn)? ->send給前端
? });
? reqHttp 請求對象
? reqHttp.on('error',(err)=>{console.log(err)}); 監(jiān)聽請求失敗信息
? reqHttp.end();請求結(jié)束
socket.io
場景:
Web領(lǐng)域的實時推送技術(shù),也被稱作Realtime技術(shù)。這種技術(shù)要達到的目的是讓用戶不需要刷新瀏覽器就可以獲得實時更新。它有著廣泛的應(yīng)用場景,比如在線聊天室、在線客服系統(tǒng)、評論系統(tǒng)、WebIM等。
原理:
雙向通信,前端H5api (WebSocket) + 后端net模塊
API:
cn:
https://www.w3cschool.cn/socket/socket-k49j2eia.html
en:
https://socket.io/
配合express腳手架
修改www:
const SOCKETIO = require('socket.io');//創(chuàng)建socket實例
const io = SOCKETIO.listen(server);//監(jiān)聽http實例,未來3000端口下的http請求,會觸發(fā)socket
module.exports = io;
注意: www 不熱重啟,不檢查
服務(wù)端主動推送到客戶端:
let io = require('../../../bin/www'); require要在需要時再引入
? ? io.emit('mess_type',{data:'服務(wù)端的推送數(shù)據(jù)')//推送
客戶端配置:
html里面引入:
<script src="/socket.io/socket.io.js"></script>
連接服務(wù)器:socket = io('http://localhost:3000');
客戶端訂閱
? ? socket.on('mess_type',(data)=>{
console.log('首頁_客戶端收到',data)
})