Koa学习笔记1

Koa–注册登录接口实现 笔记

一、搭建项目
  1. 编写基本app。注意:use必须接收一个函数作为中间件
//导入koa模块
const Koa=require('koa');
//创建koa实例
const app=new Koa();
//编写中间件
app.use((ctx,next)=>{
   ctx.body+='hello koa'
})
//监听端口
app.listen(3000,()=>{
    console.log('server is running on http://localhost:3000')
})
  1. 项目优化:使用nodemon工具自动重启服务,在package.json文件的script下加入"dev":“nodemon ./src/app.js”, ,再执行npm run dev 启动服务。
  2. dotenv模块的作用:将环境变量中的变量从.env加载到process.env。使用dotenv可以将环境变量的相关配置独立于代码之外。
//config.default.js
const dotenv=require('dotenv')
const path=require('path')
dotenv.config({path:path.resolve(__dirname,'../../.env')})
//console.log(process.env.APP_PORT)

//module.exports可以使用该对象将模块内的成员共享出去,供外界使用
//外界用require()方法导入自定义模块时,得到的是module.exports所指的对象
module.exports=process.env;
//app.js
//导入koa模块
const Koa=require('koa');
//
const {APP_PORT}=require('./config/config.default')
//创建koa实例
const app=new Koa();
//编写中间件
app.use((ctx,next)=>{
   ctx.body='hello koa'
})
//监听端口
app.listen(3000,()=>{
    console.log(`server is running on http://localhost:${APP_PORT}`)
})
二、添加路由
  1. 路由:根据不同的URL,调用不同的处理函数
const Koa=require('koa');
const Router=require('koa-router')
//
const {APP_PORT}=require('./config/config.default')

const app=new Koa();
const indexRouter=new Router();
indexRouter.get('./',(ctx,next)=>{
    ctx.body='hello index'
})
const userRouter=new Router();
userRouter.get('./user',(ctx,next)=>{
    ctx.body='hello user'
})
//编写中间件
app.use(indexRouter.routes())
app.use(userRouter.routes())
//监听端口
app.listen(3000,()=>{
    console.log(`server is running on http://localhost:${APP_PORT}`)
})
三、koa-body
  1. koa-body中间件的基本作用是帮助解析http中body,包括json、表单、文本、文件等。使用koa-body可以替代koa-bodyparser和koa-multer(koa-multer是用于图片上传的中间件)。
//导入koa-body
const KoaBody=require('koa-body')
app.use(KoaBody())//注意:一定要在路由处理之前注册Koabody!!!

  1. 注意:一定要在路由处理之前注册KoaBody
四、目录结构优化
  1. 在实际项目中,往往会对代码进行拆分,增加代码的易读性。再将拆分的文件以自定义模块的方式导入,这样可以降低代码的耦合性。(自定义模块导入:使用module exports对象和require方法,require导入是指向的是module exports指向的对象)
    1. 将http服务和app业务拆分
    2. 将路由与控制器文件拆分,路由:解析URL,分布给控制器对应的方法;控制器:处理不同的业务。
    3. 将中间件处理进行拆分等等,在编写代码时可根据情况对重复代码进行重构。
      2.举个例子, index.js是实例app的文件,config下是环境变量的配置文件,router是路由文件,controller是路由控制文件,service是数据库操作文件,main.js是服务启动文件。
五、rest client插件使用
  1. 使用vscode里的rest client插件发送http请求来进行测试。在目录下创建.http文件或.rest文件编写http请求。
### 测试
POST http://localhost:3000/users/login

###测试
POST http://localhost:3000/users/register
Content-Type: application/json

{
    "user_name":"alice",
    "password":"1234567"
}
六、数据库操作
  1. Sequelize 是一个基于 promise 的 Node.js ORM数据库工具。支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server。
  2. ORM:对象关系映射。数据表映射一个类,数据表中的数据行(记录)对应一个对象,数据表中的字段对应对象的属性,数据表的操作对应对象的方法。
  3. 安装:需要安装sequelize和数据库驱动程序。
    npm install sequelize
    npm install mysql2
  1. 连接到数据库:创建一个Sequelize实例,然后将连接参数传递到Sequelize构造函数,或通过连接一个URI来完成。(URI:统一资源标志符,表示web上每一种可用资源)
//连接数据库

const {MYSQL_HOST,
    MYSQL_PORT,
    MYSQL_USER,
    MYSQL_PWD,
    MYSQL_DB}=require('../config/config.default')

const {Sequelize}=require('sequelize')//解构出类
//传递连接参数,连接参数
const sequelize=new Sequelize(MYSQL_DB,MYSQL_USER,MYSQL_PWD,{
    host:MYSQL_HOST,
    dialect:'mysql',
})

//测试连接是否成功
//autjenticate()返回的是promise对象
sequelize.authenticate().then(()=>{
    console.log('数据库连接成功')
}).catch((err)=>{
    console.log('数据库连接失败',err)
})

//导出
module.exports=sequelize;
  1. Sequelize中的模型:数据库中表的抽象,会规定数据库中表的名称,具有的列及数据类型等等。
const {DataTypes}=require('sequelize')
const seq=require('../db/seq')
//创建并定义模型
const User=seq.define('zd_user',{
    //id会被自动创建
    user_name:{
        type:DataTypes.STRING,
        allowNull:false,
        unique:true,
        comment:'唯一用户名'
    },
    password:{
        type:DataTypes.CHAR,
        allowNull:false,
        comment:'密码'

    },
    is_admin:{
        type:DataTypes.BOOLEAN,
        allowNull:false,
        defaultValue:0,
        comment:'是否为管理员'
    },
})
module.exports=User;
  1. 数据库的增删改查等操作下个笔记单独记一下吧。
七、加密
  1. 将密码保存到数据库之前,需要对密码进行加密处理。使用bcryptjs进行加密
  2. 加盐加密:
//加密
const crpytPassword = async (ctx, next) => {
    const { password } = ctx.request.body
    //加盐加密,生成盐
    const salt = bcryptjs.genSaltSync(1567)
    //加密,hash保存的是密文
    const hash = bcryptjs.hashSync(password, salt)
    ctx.request.body.password = hash
    console.log('已加密')
    await next()
}

八、用户认证
  1. 用户认证:登录后保持登录状态;
  2. cookie:浏览器发起HTTP请求,服务器会进行cookie设置,也就是Set-Cookie,Cookie里有name和value两个重要属性,服务器会将Cookie里属性的值填充完整,Cookie发给浏览器后,浏览器会自动保存起来,这样浏览器以后发送的每一个请求都会自动附上这个Cookie。但是用户名和密码放在Cookie里是不安全的,容易泄露。
  3. Session:在浏览器和服务器之间维持一个会话的方式,不同的网站与每个用户的会话都设定了时间以及唯一ID(Session ID),浏览器访问服务器是会话的开始,登录成功后服务器会创建一个Session ID和会话结束时间,服务器会把Session ID和会话结束时间发给浏览器,浏览器会将Session ID加到cookie里,并将会话结束时间设置为这个cookie的有效期,下次访问浏览器会将带有Session ID的cookie发送给服务器,直至cookie的有效期失效,浏览器自行删除这个cookie,会话就结束了,下次就需要重新登录。
  4. JSON WEB TOKEN:jwt,用户第一次登录网页后,服务器会生成一个token,服务器不需要保存这个token,只需要保存token签名的密文,接着把token发给浏览器,可以让浏览器以cookie或者storage的形式进行存储。
  5. jwt由三部分组成:头部header、载荷payload和签证signature。header部分声明用什么算法来生成签名,payload部分是一些特定的数据,header和payload部分的内容会经过Base64编码得到的数据和密码使用一定的算法进行运算最终得到签名信息,这样一个完整的JWT就可以发送给客户端了。
  6. cookie是一种数据载体,跟随http的每个请求发送给服务器端。session和token的主要区别:session保存在服务器端,浏览器使用Session ID进行验证,而token是保存在浏览器里,而服务器只需要保存密码即可。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值