Node练习 API接口项目

Node练习 API接口项目

准备工作

1 创建项目

1.新建api_server文件夹
2.npm init -y 新建api_server文件夹的包管理配置文件
3.安装express npm i express
4.创建一个简单的服务器app.js

const express = require('express');
const app = express()
app.listen(8080,()=>{
    console.log('服务器启动成功!');
})

2 配置cors跨域

1.安装中间件npm install cors
2.导入中间件const cors = require('cors')
3.在所有路由前注册全局中间件app.use(cors())

//配置跨域
const cors = require('cors');
app.use(cors());

3 配置解析表单数据urlencoded的中间件

使用express的内置中间件express.urlencoded() 解析URLencoded格式的请求体数据

//false表示不使用第三方的解析方式,只使用自身的解析方式
app.use(express.urlencoded({extended:false}));

4 初始化路由

1.在项目根目录中,新建router文件夹,存放所有的路由模块。路由模块只存放客户端的请求与处理函数之间的映射关系。
2.router_handler文件夹,用来存放路由具体的处理函数
用户路由模块,新建/router_handler/user.js

//注册的处理函数
exports.regUser = (req,res)=>{
    res.send(`${req.url} ok`);
}
//登录的处理函数
exports.login =(req,res)=>{
    res.send(`${req.url} ok`);
}

3.初始化用户模块路由 新建/router/user.js

const express = require(express);
const router = express.Router();

const {regUser,login} = require('../router_handler/user')

//注册新用户
router.post('/reguser',regUser)
//登录
router.post('/login',login)

module.exports = router;

4.在app.js中导入并使用用户路由模块

//导入并使用用户路由模块
const userRouter = require('./router/user');
app.use('/api',userRouter) //访问userRouter里面的路由时,需要添加前缀/api

5.测试
请求/api/reguser 请求成功
在这里插入图片描述

登录注册的用户接口

1 创建用户信息表

在这里插入图片描述

2 安装配置mysql模块

1.安装mysql模块

npm i mysql

2.新建/db/index.js,创建数据库的连接对象

const mysql = require('mysql');
const db = mysql.createPool({
    host:'127.0.0.1',
    user:'root',
    password:'admin123',
    database:'test'

})
module.exports = db

3 注册

1.检测表单数据是否合法

exports.regUser = (req,res)=>{
    //获取客户端提交的用户信息
    const userinfo = req.body;
    //真实清空更复杂
    if(!userinfo.username||!userinfo.password){
        return res.send({status:1,message:'用户名不合法'})
    } 
    res.send(`${req.url} ok`);
}

校验规则使用封装好的包实现,注册为路由的局部中间件,访问该路由的时候会先进入验证中间件进行验证

2.检测用户名是否被占用

const db = require('../db/index');
exports.regUser = (req,res)=>{
   	//....
    const sqlStr = 'select id from users where username=?'
    db.query(sqlStr,userinfo.username,(err,result)=>{
        if(err)return res.send({status:1,message:err.message});
        //查询过来的结果是数组,说明用户名被占用
        if(result.length>0)return res.send({status:1,message:'用户名被占用'});
    })

3.对密码进行加密处理
使用bcrypt.js对用户密码进行加密

  • 加密之后的密码,无法被逆向破解
  • 同一铭文密码多次加密,得到的加密结果各不相同

安装bcrypt.js

npm i bcryptjs@2.4.3

使用

const bcrypt = require('bcyptjs');
const db = require('../db/index');
exports.regUser = (req,res)=>{
   	//....
    db.query(sqlStr,userinfo.username,(err,result)=>{
      //....
      //密码加密 bcrypt.hashSync(明文密码,随机盐的长度) 第二个参数提高加密之后的安全性
      bcrypt.hashSync(userinfo.password,10)
    })

4.插入新用户

bcrypt.hashSync(userinfo.password,10)
const sql = 'insert into users set ?'
db.query(sql, { username: userinfo.username, password: userinfo.password }, (err, results) => {
     if (err) return res.send({ status: 1, message: err.message })
 	if (results.affectedRows !== 1) return res.send({ status: 1, message: '注册用户失败,请稍后再试!' })
     res.send({ status: 0, message: '注册成功!' })
})

4 项目优化:自定义全局中间件

简化如下代码

res.send({ status: 1, message: '注册用户失败,请稍后再试!' })

在app.js中,所有路由之前,声明一个全局中间件,为res对象挂载一个res.cc()函数

// 一定要在路由之前,封装 res.cc 函数
app.use((req, res, next) => {
  // status 默认值为 1,表示失败的情况
  // err 的值,可能是一个错误对象,也可能是一个错误的描述字符串
  res.cc = function (err, status = 1) {
    res.send({
      status,
      message: err instanceof Error ? err.message : err,
    })
  }
  next()
})

使用

//成功
res.cc('注册成功!', 0)
//失败,第二个参数默认是1
res.cc(err)

5 登录

1.检测表单数据是否合法

校验规则使用封装好的包实现

2.根据用户名查询用户的数据

const userinfo =req.body;
const sql = 'select * from users  where username=?'
db.query(sql,userinfo.username,(err,result)=>{
if(err) return res.cc(err)
if(result.length!==1) return res.cc('登录失败')
//判断密码是否正确
})

3.判断用户输入的密码是否正确
调用bcrypt .compareSync(用户提交的密码,数据库的密码)
返回值为布尔值
4.生成JWT的Token字符串

在生成Token字符串时,由于Token字符串会最终会被保存在客户端,所以需要删除密码和头像的值。

安装JWT相关的包

npm install jsonwebtoken

在登录的时候生成token

const jwt = require('jsonwebtoken')
//定义secret密钥,用于加密和解密
const secretkey = 'ranan'
//结构之后如果后面有同名属性,后面的会覆盖前面的
const user = {...results[0],password:'',usr_pic:''}
//jsonwebtoken.sign(用户信息对象,加密密钥,配置对象):将用户的信息加密成JWT字符串
jsonwebtoken.sign(user,secretkey,{expiresIn:'30h'});//如果有多个密钥-有效期,可以考虑抽离成一个配置文件
return res.send({
	status:0,
	message:'登录成功',
	token:'Bearer  'tokenStr
})

6 配置解析Token中间件

npm install jsonwebtoken express-jwt

在路由之前配置解析Token的中间件,还需要配置哪些路径需要进行Token验证

 //如果出错可以看express-jwt文档,有版本差异
const {expressjwt:expJWT] = require("express-jwt");
//将JWT字符串还原为JSON对象 .unless()用来指定哪些接口不需要访问权限
app.use(expressJWT({secret:secretkey,algorithms:['HS256']})).unless({path"[/^\/api\//]});

如果Token过期之后,需要捕获并处理Token认证失败后的错误

app.use((err,req,res,next)=>{
	//token解析失败导致的错误,过期或不合法
	if(err.name === 'UnauthorizedError'){
		return res.send({status:401,message:'无效token'})
	}
	//其他原因
})

后面基本是重复的步骤就没有记录了。
项目视频连接:https://www.bilibili.com/video/BV1a34y167AZ?p=89

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值