前端发起请求,后端响应请求的整个过程

news2024/11/21 2:27:11

文章目录

  • 前端
    • 注册页面
    • axios 请求方法
      • URL 路径配置
      • 自定义 axios
      • 方法封装
  • 后端
    • 创建服务器模块
    • 接口方法模块
    • 连接数据库

本文分为:前端、后端两部分讲诉。以下是前端发送请求到服务器,服务器响应前端,的整个过程的图解:
在这里插入图片描述

前端

前端主要是发起请求,本文使用自定义的axios请求方法,分为注册页面模块axios 请求方法模块两部分。

前端运行地址: http://localhost:8080/

注册页面

该页面主要是通过点击提交按钮,触发点击事件,发起注册请求。

目标端口是:http://localhost:3000/api/login,协议、域名、端口号之中,存在端口号与前端运行地址不一样,满足跨域请求的条件。后端部分会讲到:如何解决跨域问题。

<el-button type="primary" @click="submitForm('loginForm')">提交</el-button>

点击提交,触发并传递给submitForm方法参数loginForm。其中,loginForm数据形式是

loginForm:{
    username:"",  
    pass:"",
}

第 7 行,submitForm发起请求,调用自定义的axios方法:api.login(){}

import api from "@/api"

submitForm(formName) {
    this.$refs[formName].validate((valid)=> {
        if(valid){
            if(this.currentIndex==='login'){
                api.login(this.loginForm).then(res=>{
                    // 用户登陆成功
                    if(res.data.status === 200){
                        //用户信息存储到 vuex 和 localstorage
                        this.setUser(res.data)
                        localStorage.setItem('hp',JSON.stringify(res.data))
                        this.$notify({
                            title: '登录成功',
                            type: 'success'
                        });
                        // 用户登陆成功跳转到home页面
                        this.$router.push('/')
                    }else{
                        this.$notify.error({
                            title: '登录失败',
                            message: '请重新登录'
                        });
                    }
                })
            }
            if(this.currentIndex==='register'){
                api.register(this.registerForm).then(res =>{
                    console.log(res)
                    if(res.data.status === 200){
                        this.$notify({
                            title: '注册成功',


                            type: 'success'
                        });
                    }
                })
            }
        }else{
            return ;
        }
    })
}

axios 请求方法

为了请求方法的应用性更强,选择自定义请求的方式编写封装请求。

考虑到模块开发、代码可读性的好处,将请求方法封装模块分为路径配置自定义 axiosAPI封装三部分。

URL 路径配置

每次请求都使用以下预定义的路径,该文件向外导出base对象

const base = {
  baseUrl: "http://localhost:3000",
  register: "/api/register",//用户的接口
  login: "/api/login",
  selectTbItemAllByPage: '/api/backend/item/selectTbItemAllByPage',//商品列表请求路径
  total: "/api/total",//商品总条数
  search: "/api/search" //商品 模糊查询
}
export default base

自定义 axios

自定义axios 易用、简洁且高效的http库,对发起的axios请求和响应进行拦截

// /api/utils/request.js 文件
import axios from "axios
// 引入qs模块,用来序列化post类型的数据
import qs from 'qs'
import router from "@/router"

//主要步骤:三步
// 1.创建一个axios实例
// 2.拦截器--请求拦截
// 3.拦截器--响应拦截

// 1.创建一个axios实例
const instance = axios.create({
    timeout: 5000,  //超时处理,超过时间告诉用户超时
    // baseURL: "http://localhost:3000",
})

instance.all = axios.all;
instance.spread = axios.spread
// 设置post的请求头
instance.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
// interceptors 拦截器
// 2.请求拦截 做一个逻辑后再把请求发送,可以用于配置公用的逻辑,就不用每个请求都配一遍。

instance.interceptors.request.use(
    // 请求拦截配置  
    // 拦截成功,返回非promise实例对象config
    config => {
        if (config.method === 'post') {
            config.data = qs.stringify(config.data);
        }
        return config;

        // 判断token是否存在,存在就添加到请求头上
        // const token = store.state.loginModule.user.token;
        // if(token){
        //     config.headers.authorization = store.state.loginModule.user.token;
        // }
    },
    // 拦截失败时,返回promise
    error => Promise.reject(error)
)

const toLogin = () => {
    router.push("/login")
}
// errorHandle打印失败状态码对应的 描述和路由去向
const errorHandle = (status, info) => {
    switch (status) {
        case 400:
            console.log("服务器收到客户端通过PUT或者POST请求提交的表示,表示的格式正确,但服务器不懂它什么意思");
            toLogin();
            break;
        case 401:
            console.log("客户端试图对一个受保护的资源进行操作,却又没有提供正确的认证证书");
            toLogin();
            break;
        case 403:
            console.log("客户端请求的结构正确,但是服务器不想处理它");
            toLogin();
            break;
        case 404:
            console.log("资源被围定义(网络请求地址错误)");
            break;
        case 500:
            console.log("执行请求处理代码时遇到了异常,它们就发送此响应代码");
            break;
        case 503:
            console.log("最可能的原因是资源不足:服务器突然收到太多请求,以至于无法全部处理");
            break;
        default:
            console.log(info);
            break;
    }
}
// 3.interceptors拦截器配置response响应拦截
instance.interceptors.response.use(
    // 成功时
    response => response.status === 200 ? Promise.resolve(response) : Promise.reject(response),
    // 失败时
    error => {
        const { response } = error;
        if (response) {
            errorHandle(response.status, response.data);
            return Promise.reject(response);
        } else {
            console.log("请求被中断");
        }
    }
)
// 封装get请求
export function get(url, params) {
    return new Promise((resolve, reject) => {
        instance.get(url, params).then(res => {
            //请求回调成功
            console.log('封装这里,', params)
            resolve(res.data);
        }).catch(err => {
            reject(err.data);
        })
    })
}
// 封装post请求

export function post(url, params) {
    return new Promise((resolve, reject) => {
        instance.post(url, params).then(res => {
            //请求回调成功
            resolve(res.data)
        }).catch(err => {
            reject(err.data)
        })
    })
}

export default instance

方法封装

// api/index.js 文件
// 入口文件
// 导入自定义ajax封装库axios: myaxios 
import myaxios from "@/api/utils/request"
// 导入自定义路径配置,模块化开发 简化url 
import base from "./base"

// 定义前端的发送请求方法 
const api = {
  // 注册请求
  register(params) {
    // 调用自定义asiox(myaxios)封装的post方法
    return myaxios.post(base.baseUrl + base.register, params)
  }
 }
}
// 定义的请求方法全部导出
export default api;

后端

本文采用:node.js + express+MySQL,创建web 服务器,构建后端。后端编写分为服务器模块接口模块连接数据库模块三部分,都是server文件夹下的 js 文件。

后端运行地址:http://127.0.0.1:3000/

创建服务器模块

因此,需要完成获取数据请求必须解决跨域问题,跨域问题可以在前端或者后端解决。本文采取后端解决,使用 CORS。同源安全策略 默认阻止“跨域”获取资源。但是 CORS 给了 web 服务器这样的权限,即服务器可以选择,允许跨域请求访问到它们的资源。

//接口服务器 server/index.js文件
// 1.导入express
const express = require("express")
//跨域请求处理 后台处理
const cors = require("cors")
//post传参问题
const bodyParser = require("body-parser")
// 导入自定义路由
const router = require("./router")

// 2.创建web服务器
const app = express()

// 注册中间件
app.use(cors());
// app.use(express.json());
app.use(bodyParser.urlencoded({ extended: false }))
//路由访问前缀
app.use('/api', router)

// 3.启动服务器
app.listen(3000, () => {
  console.log('express server running at http://127.0.0.1')
})

其中,web服务器服务器对象 app,通过导入接口方法模块,并使用app.use('/api', router)实现接口方法应用。

接口方法模块

注册的步骤:主要是实现服务器获取请求体的数据,然后将数据插入数据库,最后给客户端响应。

// server/router.js文件
// 设置路由,定义对应post,URL的处理函数
const express = require("express")
// 创建路由对象
const router = express.Router();
//导入数据库配置对象
const sqlClient = require('./dbconfig')
//导入JWT生成token
const JWT = require("jsonwebtoken")
//导入JWT解密
const expressJWT = require("express-jwt")
// 请求post和url=localhost:3000/api/register 的注册路由
const url = require("url");
const { send } = require("process");


router.post("/register", (req, res) => {
  //接收请求对象携带的数据
  const { username, pass, email } = req.body;
  //sqlClient实现连接数据库,并将用户数据插入数据库 并回调函数响应数据
  sqlClient("insert into user values(null,?,?,?)", [username, pass, email], result => {
    //插入成功 并响应对象数据给客户端
    if (result.affectedRows > 0) {
      res.send({
        status: 200,
        msg: "注册成功"
      })
    } else {
      res.send({
        statu: 401,
        msg: "注册失败"
      })
    }
  })
})

连接数据库

只需要导入mysql库,即可以实现数据库连接,并向外导出操作数据库的方法对象,该函数返回一个操作结果。

// server/dbconfig.js文件
const mysql = require("mysql")

//定义连接对象
const client = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "root",
  database: "vue_mall"
})
//定义操作数据库的方法,参数为sql语句,数组数据,回调函数
const sqlClient = (sql, arr, callback) => {
  client.query(sql, arr, (error, result) => {
    if (error) {
      //发生错误,返回错误信息
      console.log(error)
      return
    }
    //成功,则调用回调函数返回操作的结果
    callback(result)
  })
}
module.exports = sqlClient

使用 mysql 对象的createConnection方法创建连接数据库对象 client,然后 定义一个sqlClient对象,其中 sqlClient 需要参数sql语句数组数据,便会调用回调函数,并返回sql语句数据操作数据库的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在vue项目当中绑定键盘事件

在vue项目当中&#xff0c;有时会遇到为文本输入框或者button按钮绑定键盘事件&#xff0c;最常见的就是enter回车事件。 按照vue官网给出的方法是&#xff1a; v-on:keyup.enter 简写&#xff1a;keyup.enter &#xff08;注意&#xff1a;如果是绑定在组件上的话&#xff…

让她/他心动的告白,页面制作(9个页面+链接+代码,原生HTML+CSS+JS实现)

文章目录一、pikachu告白信件1.效果图2.代码1.envelope.html2.envelope.css3.pikachu.html4.pikachu.css二、告白小宇宙1.效果图2.代码1.index.html2.index.css三、流光爱心1.效果图2.代码1.index.html2.index.css3.index.js四、520贺卡&#xff08;1&#xff09;1.效果图2.代码…

Node.js16.15.1的一个报错及解决方案

Node.js16.15.1的一个报错及解决方案前言准备工作核心解决方案测试前言 最近在进行Node.js的下载安装和环境的配置&#xff0c;在官网上下载了LTS版本16.15.1&#xff0c;没想到在后续的使用中出现一种报错。 例如&#xff0c;在命令提示符窗口中输入npm -v 想要查看npm的版本…

微信小程序下拉刷新

一、如何设置微信小程序所有页面都可以下拉刷新呢&#xff1f; 1、在app.json的"window"中进行配置 &#xff08;1&#xff09;把"backgroundTextStyle":“light"改为"backgroundTextStyle”:“dark” &#xff08;2&#xff09;添加"enab…

【青山css】css3阴影效果属性详解及创意玩法

前言 css阴影效果是我们经常使用的一个css属性&#xff0c;但你有仔细了解过它吗&#xff1f;是不是用的时候直接从蓝湖上复制过来就行了&#xff0c;那你了解它的每个参数吗&#xff1f;用阴影又能实现哪些好看的效果呢&#xff1f;来看一看我收集总结的css阴影知识吧&#x…

js执行顺序

1.首先js是单线程的 所有的同步任务都是按顺序依次执行的&#xff0c;前面的执行完了之后才会执行后面的任务。遇到计算量大的代码就会阻塞在这里。下面的代码就是打印输出10000次&#xff0c;当循环走完了之后 才会走后面的代码&#xff0c;输出的时间是981ms 输出981ms 2.因…

Plugin [id: ‘com.android.application‘, version: ‘7.*.*‘, apply: false] was not found 的解决办法

呜呜~ 在新建项目File->New->New Project->Empty Activity 后遇到以下情况&#xff1a;Plugin [id: com.android.application, version: 7.2.2, apply: false] was not found in any of the following sources: 问题1&#xff1a;配置了 proxy 把File | Settings | A…

vue3中使用vue-i18n(ts中使用$t, vue3不用this)

vue项目里多语言工具一直用的vue-i18n。 以前用的 vue2&#xff0c;也没啥大问题&#xff0c;就是配置好之后用t(“你的属性名”)就行&#xff0c;现在用vue3其实本来也没太大变化。 但是配置完之后&#xff0c;在html中用$t()没有问题&#xff0c;显示文案什么的一切正常。而在…

关于前端提示err_ssl_protocol_error错误的一次记录

当前端提示错误的时候按照 1.同步系统的时间&#xff0c;日期和区域 Chrome上出现“ err_SSL_protocol_error”的最常见原因之一是错误的时间和日期配置。错误的时区选择也会导致此错误。如果您在设备上遇到此错误&#xff0c;请快速修改时间&#xff0c;数据和区域设置。如果该…

2023高频前端面试题(持续更新 含答案)

1&#xff0c;es6有哪些新特性&#xff1f;ES6是2015年推出的一个新的版本、这个版本相对于ES5的语法做了很多的优化let和const具有块级作用域&#xff0c;不存在变量提升的问题。新增了箭头函数&#xff0c;简化了定义函数的写法&#xff0c;同时可以巧用箭头函数的this、&…

用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心)

活动地址&#xff1a;CSDN21天学习挑战赛 用代码写出浪漫合集&#xff08;爱心、玫瑰花&#xff09; 本文目录&#xff1a; ​一、前言 二、用python、matplotlib、Matlab、java绘制爱心 &#xff08;1&#xff09;爱心图形1&#xff08;弧线型&#xff09;&#xff08;显示…

【微信小程序】-- 案例 - 自定义 tabBar(四十六)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…

uniapp 使用第三方UI库 uview-plus

前言&#xff1a;开发uniapp时&#xff0c;有些功能&#xff0c;使用UI库提供的更加方便和简单。所以我就搜索uniapp 的UI库&#xff0c;根据网上和uniapp的插件市场&#xff0c;确定使用uviewUI库。 uniapp项目使用的vue2 -----> 对应 uView uniapp项目使用vue3 -…

css3渐变色

作用&#xff1a;让元素在两个或多个指定的颜色之间显示平稳的过渡。 种类&#xff1a;分为线性渐变与径向渐变 一、线性渐变 1、向下/向上/向左/向右/对角方向 语法&#xff1a;background-image: linear-gradient(direction, color-stop1, color-stop2, ...); direction…

Vue的事件处理,点击事件

目录 1、 v-on:click 绑定属性示例&#xff1a; 2、 v-on:click 绑定方法示例&#xff1a; 3、 v-on:click 绑定特殊变量示例&#xff1a; 4、事件处理的修饰符 按键修饰符&#xff1a; v-model表单修饰符&#xff1a; v-bind指令修饰符&#xff1a; 监听DOM事件使用的是v…

vue+mysql实现前端对接数据库

下载引入相关依赖 1、cnpm install --save mysql 2、cnpm install --save axios 3、cnpm install --save body-parser 4、cnpm install --save express 5、cnpm install --save crypto 在main中引入axios import Axios from axios Vue.prototype.$axios axios 配置连接…

使用python搭建一个简易的Web服务

介绍 简单的说&#xff0c;web服务器就是机器上监听了本地的IP和端口的一个进程&#xff0c;当有客户的请求进来时&#xff0c;它会响应客户的请求并返回相应的信息。客户端和服务端之间的通信基于HTTP协议&#xff0c;客户端可以是浏览器或者任何支持HTTP的应用。我们平时访问…

vue+element ui完成头像上传功能(文件转base64)以及自定义布局。

1、自定义布局 查阅element ui的头像上传功能&#xff0c;发现是点击头像位置才可以上传&#xff0c;那我们可不可以点击头像外部的按钮来上传头像呢&#xff1f; element ui效果图&#xff1a; 目标效果&#xff1a; 在实…

OpenAI 成近期顶流团队?如何使用 OpenAI 和 Node.js 构建 AI 图像生成器?

摘要: 12月7号&#xff0c;知名人工智能研究机构 Open AI 在Youtub上发布视频介绍使用OpenAI 和 DALL-E 模型创建一个网络应用程序&#xff0c;该应用程序将根据输入的文本从头开始生成图像。https://www.youtube.com/watch?vfU4o_BKaUZE 前言&#x1f496; 大家好&#xff0…

全网多种方法解决Invalid Host header(无效的主机头)服务器域名访问出现的错误

文章目录1. 复现错误2. 分析错误3. 解决错误4. 其他方法解决该错误1. 复现错误 在搭建vue-cli环境&#xff0c;用nginx做代理服务器&#xff0c;访问时却显示&#xff1a;Invalid Host header。 2. 分析错误 知其然&#xff0c;知其所以然&#xff0c;我们在解决该问题之前&am…