综合案例:使用express开发接口服务(续)(代码片段)

Soistesimmer Soistesimmer     2022-12-30     617

关键词:

目录

⑦用户登录开发

1.获取请求体数据
2.数据验证

3.生成token
4.发送成功响应(包含token的用户信息)

基于JWT的身份验证 https://blog.csdn.net/YINZHE__/article/details/120080256

config/config.default.js中的jwtSecret可以用UUID保证唯一性 http://www.uuid.online/ 

默认生成的token是永久有效的,但是可以自己设置有效期时间,见controller/user.js

config/config.default.js

/**
 * 默认配置
 */

module.exports = 
  dbUrl: 'mongodb://localhost:27017/realworld',
  jwtSecret: '3301a30b-7355-4398-bc02-331eb32c9f64'

util/jwt.js

const jwt = require('jsonwebtoken')
const  promisify  = require('util')

exports.sign = promisify(jwt.sign)

exports.verify = promisify(jwt.verify)

exports.decode = promisify(jwt.decode)

 controller/user.js

const  User  = require('../model')
const jwt = require('../util/jwt')
const  jwtSecret  = require('../config/config.default')

// 用户登录
exports.login = async (req, res, next) => 
  try 
    // 1.数据验证
    // 2.生成token
    const user = req.user.toJSON()
    console.log(user)
    const token = await jwt.sign(
      userId: user._id
    , jwtSecret,
      expiresIn: 60 * 60 * 24
    )
    // 3.发送成功响应(包含token的用户信息)
    delete user.password
    res.status(200).json(
      ...user,
      token
    )
   catch(err) 
    next(err)
  


...    //其它代码不变

validator/user.js

const validate = require('../middleware/validate')
const  body  = require('express-validator')
const  User  = require('../model')
const md5 = require('../util/md5')

... //原代码不变

exports.login = [
  validate([
    body('user.email').notEmpty().withMessage('邮箱不能为空'),
    body('user.password').notEmpty().withMessage('密码不能为空')
  ]),
  validate([
    body('user.email').custom(async (email,  req ) => 
      const user = await User.findOne( email )
        .select(['email','username','bio','image','password'])
      if (!user) 
        return Promise.reject('用户不存在')
      
      // 将数据挂载到请求对象中,后续的中间件也可以使用了
      req.user = user
    )
  ]),
  validate([
    body('user.password').custom(async (password,  req ) => 
      if(md5(password) !== req.user.password) 
        return Promise.reject('密码错误')
      
    )
  ])
]

router/user.js

const express = require('express')
const userCtrl = require('../controller/user')
const userValidator = require('../validator/user')

const router = express.Router()

// 用户登录
router.post('/users/login', userValidator.login, userCtrl.login)

...    //原代码不变

module.exports = router

生成token并发送

⑧获取用户信息 

在获取之前,首先要验证token

router/user.js 

const express = require('express')
const userCtrl = require('../controller/user')
const userValidator = require('../validator/user')
const auth = require('../middleware/auth')

const router = express.Router()

...    //原代码不变

// 获取当前登录用户
router.get('/user', auth, userCtrl.getCurrentUser)

...    //原代码不变

module.exports = router

controller/user.js

const  User  = require('../model')
const jwt = require('../util/jwt')
const  jwtSecret  = require('../config/config.default')

...    //原代码不变

// 获取当前登录用户
exports.getCurrentUser = async (req, res, next) => 
  try 
    res.status(200).json(
      user: req.user
    )
   catch(err) 
    next(err)
  


...    //原代码不变

 middleware/auth.js

const  verify  = require('../util/jwt')
const  jwtSecret  = require('../config/config.default')
const  User  = require('../model')

module.exports = async (req,res,next) => 
  // 从请求头获取token数据
  let token = req.headers['authorization']
  token = token ? token.split('Bearer ')[1] : null
  if(!token) 
    return res.status(401).end()
  
  try 
    const decodedToken = await verify(token, jwtSecret)
    req.user = await User.findById(decodedToken.userId)
    next()
   catch(err) 
    return res.status(401).end()
  

效果

这里的token是之前登录生成的token

 在postman中,也可以统一设置请求头中的Authorization,这样就不用每次添加了

express接口综合案例(创建项目配置常用中间件路由设计提取控制器模块配置错误统一处理中间件用户注册的数据验证,密码加密)(代码片段)

...创建项目二、目录结构三、配置常用中间件3.1解析请求体express.json()express.urlencoded()3.2日志输出morgan()3.3为客户端提供跨域资源请求cors()四、路由设计本项目的接口设计参考:https://git... 查看详情

express接口案例使用jsonwebtoken(代码片段)

一、jsonwebtoken的使用jsonwebtoken官方文档constjwt=require('jsonwebtoken')//以同步的方式,生成jwt//consttoken=jwt.sign(//foo:'bar'//,'zepzepep')//以异步的方式,生成jwtconsttoken&# 查看详情

angularjs综合笔记案例

...nbsp;2.ng-bind(单项绑定))AngularJS表达式写在双大括号内:{{expression}}AngularJS使用表达式把数据绑定到HTML,这与 ng-bind 指令有异曲同工之妙。AngularJS将在表达式书写的位置"输出"数据。AngularJS表达式 很像 JavaScript表 查看详情

七初始express(代码片段)

一、Express简介1.1、什么是Express官方给出的概念:Express是基于Node.js平台,快速、开放、极简的web开发框架。通俗的理解:Express的作用和Node.js内置的http模块类似,是专门用来创建web服务器的。Express的本质:就是一个npm上的第三... 查看详情

lambda简介(代码片段)

...简四、Lambda表达式语法进阶之函数引用五、Lambda表达式之综合案例--排序Comparator六、Lambda表达式之综合案例--forEach七、Lambda表达式之综合案例--removeIf八、Lambda表达式之综合案例--线程实例化九、系统内置函数接口十、闭包 1.... 查看详情

express接口案例——完成文章增删改查接口(代码片段)

一、创建文章的Modelvarmongoose=require('mongoose')constbaseModel=require('./base-model.js')constSchema=mongoose.SchemaconstarticleSchema=newmongoose.Schema(title:type:String 查看详情

javaee框架技术之17之ssm综合案例角色管理(代码片段)

day04_SSM综合案例一、课程目标1.【掌握】角色管理功能 要求:1.1框架必须掌握住; 1.2这次的使用来复习注解sql开发 1.3restful风格的实现,有能力的去尝试2.【掌握】用户管理功能二、角色管理2.1查询角色2.1.1RoleMapper接口@Select("sele... 查看详情

十使用express写接口(代码片段)

一、使用Express写接口1.1、创建基本的服务器//导入express模块constexpress=require('express')//创建express的服务器实例constapp=express()//writeyourcodehere...//调用app.listen方法,指定端口号并启动web服务器app.listen(80,() 查看详情

十使用express写接口(代码片段)

一、使用Express写接口1.1、创建基本的服务器//导入express模块constexpress=require('express')//创建express的服务器实例constapp=express()//writeyourcodehere...//调用app.listen方法,指定端口号并启动web服务器app.listen(80,() 查看详情

怎么使用jmeter对http协议接口测试

...明文档;  第二步:从接口说明文档中整理出接口测试案例,里面要包括详细的入参和出参数据以及明确的格式和检查点。  第三步:和开发一起对接口测试案例进行评审。  第四步:结合开发库,准备接口测试案例中的... 查看详情

express接口案例——完成文章评论相关的接口(代码片段)

一、评论的Model"comment":"id":1,"createdAt":"2016-02-18T03:22:56.637Z","updatedAt":"2016-02-18T03:22:56.637Z","body":"IttakesaJacobian", 查看详情

nodejs篇express(代码片段)

文章目录前言express介绍安装RESTful接口规范express的简单使用一个最简单的服务器,仅仅只需要几行代码便可以实现。restful规范的五种接口类型请求信息req的获取响应信息res的设置中间件的使用自定义中间件解决跨域nodejs相关... 查看详情

node基础3--express框架

express框架1.初识Express1.1Express简介1.2Express的基本使用1.3托管静态资源1.4nodemonExpress路由2.1路由的概念2.2路由的使用3.1中间件的概念3.2Express中间件的初体验3.3中间件的分类4.使用Express写接口4.5CORS跨域资源共享4.6JSONP接口1.初识Express... 查看详情

express框架开发案例

   express是基于Node.js平台的web应用开发框架,用express框架开发web项目可以直接构建整个项目框架并且将前端页面跟后台贯穿起来,用起来还是灵活的;最近刚开始学习,写篇博客总结下,涉及到的东西比较多比较杂,... 查看详情

使用express写接口丨node.js-初识express

目录一、 使用Express写接口1.1创建基本的服务器1.2创建API路由模块1.3编写GET接口1.4编写POST接口1.5CORS跨域资源共享1.6JSONP接口 Node.js前篇回顾:一、 使用Express写接口1.1创建基本的服务器1.2创建API路由模块1.3编写GET接口1.4编写... 查看详情

jmeterhttp接口案例开发调试方法

HTTP接口案例案例开发的步骤为:1.了解要开发案例的业务流程,比如新增案例,是否有其它前置条件,如果有,就需要先开发好前置条件的案例2.手工开发案例或者通过jmeter录制功能开发案例3.对案例进行调试,响应结果和预期结... 查看详情

学习express目录

1.初识Express2.小案例:实现对任务清单的CRUD接口服务3.Express中间件 查看详情

使用jmeter进行http接口测试

...用Jmeter工具来完成对Http接口的测试。一、开发接口测试案例的整体方案:第一步:我们要分析出测试需求,并拿到开发提供的接口说明文档;第二步:从接口说明文档中整理出接口测试案例,里面要包括... 查看详情