• node.js后端及Vue前端跨域解决方案


    node.js后端及Vue前端跨域解决方案

    从目前我了解的情况来看,前后端跨域使用的方式有很多种,这里记录我使用最顺手的一种,即在后端使用cors跨域

    node.js后端跨域解决方案

    先看后端的入口文件:

    app.js

    const express = require('express');
    const bodyParser = require('body-parser');
    const cors = require('cors')
    const expressJWT = require('express-jwt')
    
    
    const app = express();
    const users = require('./routes/users')
    const config = require('./config')
    
    app.use(expressJWT({secret: config.jwtSecretKey}).unless({path: [/^\/api\/users/]}))
    
    // const db = require('./db/index')
    app.use(cors())
    
    app.use(express.urlencoded({extended: false}))
    app.use(bodyParser.json())
    
    
    app.get('/', (req, res) => {
        res.send('hello world !')
    })
    
    app.use('/api/users', users)
    
    const testRouter = require('./routes/testToken')
    app.use('/my', testRouter)
    
    const profiles = require('./routes/profiles')
    app.use('/api/profiles', profiles)
    
    app.use((err, req, res, next) => {
        if (err) return res.send({status: 400, message: err})
        if(err.name === 'UnauthorizedError') return res.send({status: 404, message: '身份认证失败'})
        res.send({status: 404, message: err})
    })
    
    app.listen(5000, () => {
        console.log('api server running at http://127.0.0.1:5000')
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    代码不少,但重要的就下面这几行:

    const cors = require('cors')
    app.use(cors())
    
    • 1
    • 2

    前提条件是你得先安装了cors,这样写好之后,就保证你的后端接口可以跨域访问了。

    前端vue项目

    前端要发起ajax请求,可以在入口文件main.js中全局挂载axios,而后端的接口则最好写在axios.defaults.baseURL

    main.js

    import Vue from 'vue'
    import App from './App.vue'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import router from './router'
    import axios from './http'
    
    Vue.use(ElementUI);
    axios.defaults.baseURL = 'http://127.0.0.1:5000/api/'
    Vue.prototype.$axios = axios;
    
    Vue.config.productionTip = false
    
    new Vue({
      router,
      render: h => h(App),
    }).$mount('#app')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    注意注意注意,最重要的代码是:axios.defaults.baseURL = 'http://127.0.0.1:5000/api/'

    这行代码是前端项目能跨域的关键

    注意import axios from './http'引入的是我自己写的http.js

    http.js

    import axios from "axios";
    import { Message, Loading } from 'element-ui';
    
    let loading;
    function startLoading(){
        loading = Loading.service({
            lock: true,
            text: '数据加载中',
            background: 'rgba(0,0,0,0.7)'
        })
    }
    
    function endLoading(){
        loading.close();
    }
    
    // 请求拦截
    axios.interceptors.request.use(config => {
        startLoading();
        return config
    }, error => {
        return Promise.reject(error)
    })
    
    //响应拦截
    axios.interceptors.response.use(response => {
        endLoading();
        return response
    }, error => {
        endLoading();
        Message.error(error.response.data)
        return Promise.reject(error)
    })
    
    export default axios
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    这里写了一些请求拦截和请求响应的代码,也可以不写,主要是有一些请求的动画。这个文件主要的作用是引入了axios

    前端axios请求

      methods: {
        submitForm(formName) {
          this.$refs[formName].validate(valid => {
            if (valid) {
              this.$axios
                .post("/users/register", this.registerUser)
                .then(res => {
                  // 注册成功
                  this.$message({
                    message: "注册成功!",
                    type: "success"
                  });
                  // this.$router.push("/login");
                });
            } else {
              console.log("error submit!!");
              return false;
            }
          });
        }
      }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    这就是常规的axios请求了

    post("/users/register", this.registerUser)可以保证请求到http://127.0.0.1:5000/api//users/register中后端接口的数据,这里是post请求,即向后端提交数据。

  • 相关阅读:
    【广度优先搜索】leetcode 107. 二叉树的层序遍历 II
    Apache Dubbo 高危漏洞
    vue3---组件基础(上)保姆级篇
    儿童生意的副作用
    echarts-锥型柱状图
    Python基础入门例程12-NP12 格式化输出(二)
    ruoyi-nbcio-plus基于vue3的flowable收回任务后重新进行提交表单的处理
    JAVA大学生活动中心场地管理系统计算机毕业设计Mybatis+系统+数据库+调试部署
    linux cat命令详解,作用,说明
    JDBC总述
  • 原文地址:https://blog.csdn.net/u012848304/article/details/126521715