时间:2023-05-25 01:18:01 | 来源:网站运营
时间:2023-05-25 01:18:01 来源:网站运营
Nodejs网站登录以及Redis使用开发:对于后端开发了解并不多或者只会用js开发页面效果的小伙伴来说,要开发一款真正属于自己的网站或者APP不用Node来开发服务器实在是太可惜啦,因为Nodejs能够在很短的时间内开发出网站必要的服务端接口API。使用Nodejs开发最先就是要安装Nodejs, 这里提供Nodejs官网:一 、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请求获取方式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方法获取参数方式,由于nodejs中获取POST方法是异步的,所以要先执行获取POST参数,就必须先执行该方法,于是就引入了ES6的Promise对象来定义。// 用于处理 post data 之后有这个函数的引入const getPostData = req => { const promise = new Promise((resolve, reject) => { //后面的操作能够保证req.body是一个空对象 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 }); }
我们通过上述代码方式将客户端的cookie存入req.cookie的对象当中,如果cookie的值需要修改或者新增,依据如下代码便能够实现:// 获取 cookie 的过期时间const getCookieExpires = () => { const d = new Date() d.setTime(d.getTime() + (24 * 60 * 60 * 1000)) return d.toGMTString()}//代码默认cookie存储时间为一天res.setHeader('Set-Cookie', `username=${username};path=/;httpOnly;expires=${getExpireData()}`)
不知道很多小伙伴看到这段代码后,是不是发现虽然cookie能够实现cookie客户端和服务端正常的交互功能了,但是username这个信息对于开发各类网站的开发人员来说,太过敏感了,很多客户是不希望暴露自己的用户名给所有人看,而且从安全的角度来说非常危险,通常网站登录注册只要用户名密码,等于一半的信息被别人掌握了,所以要避免这个问题就引入了session这种方式来作为服务端判断用户登录校验的一种方式。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]
这种方式看似好像实现了服务端存储session的方式,也同时避免了客户端直接传递username的困扰,但是一个服务器进程下,一个SESSION_LOGIN对象存储所有用户的cookie操作是非常不现实的,一方面服务端SESSION_LOGIN对象内存会溢出,无法存储过多数据(一个进程内分配的内存有限),而且在生产环境中基本都是采用多进程的环境,而多进程环境下客户端每次访问的服务端进程又不确定(负载均衡的问题,所以面对这样的问题一个对象明显不能作为我们存储用户信息的方式,此时我们想到了使用redis内存数据库的方式。let sessionId = req.cookie.sessionId;let needSetCookie = false;if (!sessionId ) { needSetCookie = true; sessionId = `${Date.now()}_${Math.random()}` //将sessionId 设置到redis数据库中 set(sessionId , {}) } req.sessionId = sessionId; //从redis中通过sessionId作为redis的key获取value get(req.sessionId).then(sessionData => { if (sessionData == null) { //将sessionId 设置到redis数据库中 set(sessionId , {}) req.session = {} } else { //存入req对象中可以为之后登录验证判断做准备 //登录验证从redis获取的内容信息sessionData={ username:'xxx', realname:'xxx' } req.session = sessionData } //返回获取post参数的promise对象进行下一步操作 //刚才的post参数获取方式 return getPostData(req) }) //之后可以继续执行关于存入postData的操作 .then(postData => { req.body = postData; .... }
session适合使用redis的原因主要有几点: 关键词:使用