全栈开发之node.js,mysql,整理笔记|8月更文挑战

345 阅读3分钟

这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战

前言

可喜可贺,作为一个专业摸爬滚打的前端程序猿来说,第一次实现用NodeJS+MySQL数据库开发接口,手动撒花撒花。

本项目学习为主,没有采用express、koa等框架进行,所以在整个项目层次和处理繁琐一些,整个项目层级抽离,仁者见仁智者见智吧。

紧紧连接之前两篇文章《搭建个人的后台模板(vvmily-admin-template)》《搭建个人脚手架vvmily-cli》搭建前端基础框架,后端采用nodejs(前端开发者选择一门服务端语言,nodejs是个不错的选择)+mysql(最容易入门的数据库了吧)实现基础联调。

开始

1、前置条件

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

首页观察cookieuserId属性在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时间哦
最后,我们定义的cookiesession等,都会占用内存,如果访问量起来了,是否可以支撑呢?是否可以考虑redis等方式解决呢,后面作为一个扩展吧。