Koa–注册登录接口实现 笔记
一、搭建项目
编写基本app。注意:use必须接收一个函数作为中间件
const Koa= require ( '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' )
} )
项目优化:使用nodemon工具自动重启服务,在package.json文件的script下加入"dev":“nodemon ./src/app.js”, ,再执行npm run dev 启动服务。 dotenv模块的作用:将环境变量中的变量从.env加载到process.env。使用dotenv可以将环境变量的相关配置独立于代码之外。
const dotenv= require ( 'dotenv' )
const path= require ( 'path' )
dotenv. config ( { path: path. resolve ( __dirname, '../../.env' ) } )
module. exports= process. env;
const Koa= require ( 'koa' ) ;
const { APP_PORT } = require ( './config/config.default' )
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 } ` )
} )
二、添加路由
路由:根据不同的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
koa-body中间件的基本作用是帮助解析http中body,包括json、表单、文本、文件等。使用koa-body可以替代koa-bodyparser和koa-multer(koa-multer是用于图片上传的中间件)。
const KoaBody= require ( 'koa-body' )
app. use ( KoaBody ( ) )
注意:一定要在路由处理之前注册KoaBody
四、目录结构优化
在实际项目中,往往会对代码进行拆分,增加代码的易读性。再将拆分的文件以自定义模块的方式导入,这样可以降低代码的耦合性。(自定义模块导入:使用module exports对象和require方法,require导入是指向的是module exports指向的对象)
将http服务和app业务拆分 将路由与控制器文件拆分,路由:解析URL,分布给控制器对应的方法;控制器:处理不同的业务。 将中间件处理进行拆分等等,在编写代码时可根据情况对重复代码进行重构。 2.举个例子, index.js是实例app的文件,config下是环境变量的配置文件,router是路由文件,controller是路由控制文件,service是数据库操作文件,main.js是服务启动文件。
五、rest client插件使用
使用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"
}
六、数据库操作
Sequelize 是一个基于 promise 的 Node.js ORM数据库工具。支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server。 ORM:对象关系映射。数据表映射一个类,数据表中的数据行(记录)对应一个对象,数据表中的字段对应对象的属性,数据表的操作对应对象的方法。 安装:需要安装sequelize和数据库驱动程序。
npm install sequelize
npm install mysql2
连接到数据库:创建一个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' ,
} )
sequelize. authenticate ( ) . then ( ( ) => {
console. log ( '数据库连接成功' )
} ) . catch ( ( err ) => {
console. log ( '数据库连接失败' , err)
} )
module. exports= sequelize;
Sequelize中的模型:数据库中表的抽象,会规定数据库中表的名称,具有的列及数据类型等等。
const { DataTypes} = require ( 'sequelize' )
const seq= require ( '../db/seq' )
const User= seq. define ( 'zd_user' , {
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;
数据库的增删改查等操作下个笔记单独记一下吧。
七、加密
将密码保存到数据库之前,需要对密码进行加密处理。使用bcryptjs进行加密 加盐加密:
const crpytPassword = async ( ctx, next ) => {
const { password } = ctx. request. body
const salt = bcryptjs. genSaltSync ( 1567 )
const hash = bcryptjs. hashSync ( password, salt)
ctx. request. body. password = hash
console. log ( '已加密' )
await next ( )
}
八、用户认证
用户认证:登录后保持登录状态; cookie:浏览器发起HTTP请求,服务器会进行cookie设置,也就是Set-Cookie,Cookie里有name和value两个重要属性,服务器会将Cookie里属性的值填充完整,Cookie发给浏览器后,浏览器会自动保存起来,这样浏览器以后发送的每一个请求都会自动附上这个Cookie。但是用户名和密码放在Cookie里是不安全的,容易泄露。 Session:在浏览器和服务器之间维持一个会话的方式,不同的网站与每个用户的会话都设定了时间以及唯一ID(Session ID),浏览器访问服务器是会话的开始,登录成功后服务器会创建一个Session ID和会话结束时间,服务器会把Session ID和会话结束时间发给浏览器,浏览器会将Session ID加到cookie里,并将会话结束时间设置为这个cookie的有效期,下次访问浏览器会将带有Session ID的cookie发送给服务器,直至cookie的有效期失效,浏览器自行删除这个cookie,会话就结束了,下次就需要重新登录。 JSON WEB TOKEN:jwt,用户第一次登录网页后,服务器会生成一个token,服务器不需要保存这个token,只需要保存token签名的密文,接着把token发给浏览器,可以让浏览器以cookie或者storage的形式进行存储。 jwt由三部分组成:头部header、载荷payload和签证signature。header部分声明用什么算法来生成签名,payload部分是一些特定的数据,header和payload部分的内容会经过Base64编码得到的数据和密码使用一定的算法进行运算最终得到签名信息,这样一个完整的JWT就可以发送给客户端了。 cookie是一种数据载体,跟随http的每个请求发送给服务器端。session和token的主要区别:session保存在服务器端,浏览器使用Session ID进行验证,而token是保存在浏览器里,而服务器只需要保存密码即可。