時(shí)間:2023-05-25 01:18:01 | 來(lái)源:網(wǎng)站運(yùn)營(yíng)
時(shí)間:2023-05-25 01:18:01 來(lái)源:網(wǎng)站運(yùn)營(yíng)
Nodejs網(wǎng)站登錄以及Redis使用開(kāi)發(fā):對(duì)于后端開(kāi)發(fā)了解并不多或者只會(huì)用js開(kāi)發(fā)頁(yè)面效果的小伙伴來(lái)說(shuō),要開(kāi)發(fā)一款真正屬于自己的網(wǎng)站或者APP不用Node來(lái)開(kāi)發(fā)服務(wù)器實(shí)在是太可惜啦,因?yàn)镹odejs能夠在很短的時(shí)間內(nèi)開(kāi)發(fā)出網(wǎng)站必要的服務(wù)端接口API。使用Nodejs開(kāi)發(fā)最先就是要安裝Nodejs, 這里提供Nodejs官網(wǎng):一 、Nodejs介紹
const http = require('http');const server = http.createServer((req, res) => { res.setHeader('content-type','application/json'); res.end(JSON.stringify({ errno: 0, data: [1,2,3] }));});server.listen(8000)
三、nodejs http請(qǐng)求獲取方式const querystring = require('querystring')const server = http.createServer((req, res) => { const data = []; res.setHeader('content-type','application/json'); // 獲取 path const url = req.url req.path = url.split('?')[0] // 解析 query // http://localhost:8000/api?a=1&b=2 req.query = querystring.parse(url.split('?')[1]) if (req.method==='GET' && req.path === '/api') { res.end(JSON.stringify({ errno: 0, data: req.query // { a:1, b:2 } })); }});server.listen(8000)
其次是POST方法獲取參數(shù)方式,由于nodejs中獲取POST方法是異步的,所以要先執(zhí)行獲取POST參數(shù),就必須先執(zhí)行該方法,于是就引入了ES6的Promise對(duì)象來(lái)定義。// 用于處理 post data 之后有這個(gè)函數(shù)的引入const getPostData = req => { const promise = new Promise((resolve, reject) => { //后面的操作能夠保證req.body是一個(gè)空對(duì)象 if (req.method !== 'POST') { resolve({}) return } if (req.headers['content-type'] !== 'application/json') { resolve({}) return } let postData = '' //異步方法 req.on('data', chunk => { postData += chunk.toString() }) //異步方法 req.on('end', () => { if (!postData) { resolve({}) return } resolve( JSON.parse(postData) ) }) }) return promise}
四、cookie使用方法和session的引入const cookieStr = req.headers.cookie; req.cookie = {} if (cookieStr) { cookieStr.split(';').forEach(item => { const arr = item.split('=') const key = arr[0].trim() const value = arr[1].trim() req.cookie[key] = value }); }
我們通過(guò)上述代碼方式將客戶端的cookie存入req.cookie的對(duì)象當(dāng)中,如果cookie的值需要修改或者新增,依據(jù)如下代碼便能夠?qū)崿F(xiàn):// 獲取 cookie 的過(guò)期時(shí)間const getCookieExpires = () => { const d = new Date() d.setTime(d.getTime() + (24 * 60 * 60 * 1000)) return d.toGMTString()}//代碼默認(rèn)cookie存儲(chǔ)時(shí)間為一天res.setHeader('Set-Cookie', `username=${username};path=/;httpOnly;expires=${getExpireData()}`)
不知道很多小伙伴看到這段代碼后,是不是發(fā)現(xiàn)雖然cookie能夠?qū)崿F(xiàn)cookie客戶端和服務(wù)端正常的交互功能了,但是username這個(gè)信息對(duì)于開(kāi)發(fā)各類網(wǎng)站的開(kāi)發(fā)人員來(lái)說(shuō),太過(guò)敏感了,很多客戶是不希望暴露自己的用戶名給所有人看,而且從安全的角度來(lái)說(shuō)非常危險(xiǎn),通常網(wǎng)站登錄注冊(cè)只要用戶名密碼,等于一半的信息被別人掌握了,所以要避免這個(gè)問(wèn)題就引入了session這種方式來(lái)作為服務(wù)端判斷用戶登錄校驗(yàn)的一種方式。let SESSION_LOGIN = {}let sessionId= req.cookie.sessionId;if (sessionId) { if (!SESSION_LOGIN[sessionId]) { SESSION_LOGIN[sessionId] = {} } } else { needSetCookie = true userId = `${Date.now()}_${Math.random()}` SESSION_LOGIN[sessionId] = {} } req.session = SESSION_LOGIN[sessionId]
這種方式看似好像實(shí)現(xiàn)了服務(wù)端存儲(chǔ)session的方式,也同時(shí)避免了客戶端直接傳遞username的困擾,但是一個(gè)服務(wù)器進(jìn)程下,一個(gè)SESSION_LOGIN對(duì)象存儲(chǔ)所有用戶的cookie操作是非常不現(xiàn)實(shí)的,一方面服務(wù)端SESSION_LOGIN對(duì)象內(nèi)存會(huì)溢出,無(wú)法存儲(chǔ)過(guò)多數(shù)據(jù)(一個(gè)進(jìn)程內(nèi)分配的內(nèi)存有限),而且在生產(chǎn)環(huán)境中基本都是采用多進(jìn)程的環(huán)境,而多進(jìn)程環(huán)境下客戶端每次訪問(wèn)的服務(wù)端進(jìn)程又不確定(負(fù)載均衡的問(wèn)題,所以面對(duì)這樣的問(wèn)題一個(gè)對(duì)象明顯不能作為我們存儲(chǔ)用戶信息的方式,此時(shí)我們想到了使用redis內(nèi)存數(shù)據(jù)庫(kù)的方式。let sessionId = req.cookie.sessionId;let needSetCookie = false;if (!sessionId ) { needSetCookie = true; sessionId = `${Date.now()}_${Math.random()}` //將sessionId 設(shè)置到redis數(shù)據(jù)庫(kù)中 set(sessionId , {}) } req.sessionId = sessionId; //從redis中通過(guò)sessionId作為redis的key獲取value get(req.sessionId).then(sessionData => { if (sessionData == null) { //將sessionId 設(shè)置到redis數(shù)據(jù)庫(kù)中 set(sessionId , {}) req.session = {} } else { //存入req對(duì)象中可以為之后登錄驗(yàn)證判斷做準(zhǔn)備 //登錄驗(yàn)證從redis獲取的內(nèi)容信息sessionData={ username:'xxx', realname:'xxx' } req.session = sessionData } //返回獲取post參數(shù)的promise對(duì)象進(jìn)行下一步操作 //剛才的post參數(shù)獲取方式 return getPostData(req) }) //之后可以繼續(xù)執(zhí)行關(guān)于存入postData的操作 .then(postData => { req.body = postData; .... }
session適合使用redis的原因主要有幾點(diǎn): 關(guān)鍵詞:使用
客戶&案例
營(yíng)銷資訊
關(guān)于我們
客戶&案例
營(yíng)銷資訊
關(guān)于我們
微信公眾號(hào)
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。