这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战
前言
可喜可贺,作为一个专业摸爬滚打的前端程序猿来说,第一次实现用NodeJS+MySQL数据库开发接口,手动撒花撒花。
本项目学习为主,没有采用express、koa等框架进行,所以在整个项目层次和处理繁琐一些,整个项目层级抽离,仁者见仁智者见智吧。
紧紧连接之前两篇文章《搭建个人的后台模板(vvmily-admin-template)》和《搭建个人脚手架vvmily-cli》搭建前端基础框架,后端采用nodejs(前端开发者选择一门服务端语言,nodejs是个不错的选择)+mysql(最容易入门的数据库了吧)实现基础联调。
- 采用技术栈:NodeJs + MySQL + Git
部署上线:pm2 + nginx- Github地址:github.com/wwmingly/vv…
开始
1、前置条件
- 拉取项目 git clone github.com/wwmingly/vv…
- 安装依赖
cd ./vvmily-node
npm install
- 数据库(环境搭建),对应两表 bloglist和 users以及对应的字段 key,练习数据库表结构和数据(一般不这么干!!!)已导出存放在
mysql-table文件中,需要可自行导入
- 启动数据库,更多命令请点击 这里 查看
net start mysql // 启动
mysql -u root -p // 登录
- 启动项目
npm run dev
npm run devmon // 热更新
- 等你启动,看到下图,项目搭建算是大功告成
- 项目接口测试,采用 Postman
2、项目学习
- 项目模块的拆分,形成单一的功能性文件,这不是我们所追求的么,如下每个文件对应的处理逻辑:
- 项目层级关系,每个层级只处理单一的逻辑,在我看来,学习每个技术时,首先明白数据如何一步步传递的,最终串联起来,即可算进入使用阶段,至于原理那么,需要更多的深入了,不多说,看图:
至此,剩下的就是每一步代码实现了,可自行拉去查看。
3、登录检验
- 登录还是离不开cookie,既然是学习为主,我们可以在
req.headers.cookie中获取得到,并处理一下
注:每次请求都需要验证cookie
- cookie在登录成功时,设置
// httpOnly: 不允许客户端修改
// expires 过期时间(GMT格式)
res.setHeader("Set-Cookie",`username=${username}; path=/; httpOnly; expires=${getCookieExpires()}`);
const getCookieExpires = () => {
const d = newDate();
d.setTime(d.getTime() +1*60*60*1000);// 一个小时
return d.toGMTString();
};
- 经过上面两个步骤,在其他接口验证处理时即可通过
req.cookie.username等字段判断是否已经登录 - 当接口请求时,可更新
cookie过期时间expires。
以上,基本可以实现登录验证,但是是否发现存在(信息安全)问题?
直接存放username在cookie中,是否存在隐患呢,接下来我们要解决这个问题
4、session
首页观察cookie的userId属性在session中是否为真,假则生成一个随机数,真表示已经已经登录
let userId = req.cookie.userid;
if (userId) {
needSetCookie = false; // 后面用于是否需要登录验证的接口
if (!SESSION_DATA[userId]) {
SESSION_DATA[userId] = {};
}
}else{
needSetCookie = true;
userId = `${Date.now()}_${Math.random()}`; // 随机数
SESSION_DATA[userId] = {};
}
req.session = SESSION_DATA;
完成以上步骤,即可在各个请求前通过req.session.xxx判断了,每次请求完成,更新cookie时间哦
最后,我们定义的cookie,session等,都会占用内存,如果访问量起来了,是否可以支撑呢?是否可以考虑redis等方式解决呢,后面作为一个扩展吧。