node+vue前后端分离初体验

认识前后端分离

前后端分离简单的理解就是前端与后端看做两个不同的项目,分开进行开发,互不干扰,前端只关注页面,后端只关注业务逻辑。后端提供接口,前端来调用。这里使用node作为服务器后端,前端使用vue,使用axios进行前后端交互,在本地测试一个简单的前后端分离案例。

前端配置

#使用vue-cli@3.0创建项目

vue create myapp

#进入myapp项目中

cd myapp

#引入axios

npm install axios --save

#在main.js中导入axios

import axios from 'axios'
Vue.prototype.$axios = axios
 

#在src下面的components下创建组件user.vue

<template>
    <div id="">
        <p>这是从服务器拿来的数据 {{msg}}</p>
        
    </div>
</template>
​
<script>
    export default {
      name: 'user',
      data() {
          return {
              msg: ''
          }
      },
      created () {
          this.$axios({
            method: 'get',
            url: 'http://localhost:3000/api/users'
          }).then(response => {
            this.msg = response.data
            console.log(response.data)
          }).catch(error => {
            console.log('error:' + error)
          })
        }
    }
</script>
​
<style>
</style>

#App.vue

<template>
  <div id="app">
    <user></user>
  </div>
</template>
​
<script>
import user from './components/user.vue'
export default{
    name: 'app',
    components: {
        user
    }
}
</script>
​
<style>
​
</style>
​

后端配置

#创建项目app-api

#使用npm初始项目

npm init
npm install

#在项目根目录下创建文件夹routers,在routers下创建users.js

var express = require('express');      
var router = express.Router();        
​
router.get('/api/users', function (req, res, next) {
  const data = {
    id: 1,
    name: '张三',
    sex: '男',
    age: 18
  }
  res.json(data);
});
module.exports = router;

#在项目根目录下创建app.js文件

//引包
const express = require('express');
//创建服务器
const app = express();
​
//导入路由文件
const routers = require('./routers/users.js');
​
//挂载路由
app.use(routers);
​
//设置服务器端口号
app.listen(3000,function(){
    console.log('server is running at port 3000');
});

跨域问题

这时候启动前端项目是不能访问的后端的api的,前后端互相访问需要跨域,

#解决之道,跨域可以在前端配置,也可以在后端配置

后端解决跨域

#在app-api项目中安装cors

npm install cors --save

#在app.js中配置

const cors = require('cors'); 
app.use(cors());
//注意这两行配置必须放在挂载路由之前

前端解决跨域

#在myapp项目根目录下创建vue.config.js

module.exports = {
    devServer: {
        proxy: { // 设置代理
            '/api': {
                target: 'http://127.0.0.1:3000', // 请求的目标服务器接口
                changeOrigin: true, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
                pathRewrite: { // 重写请求
                    '^/api': '/api' // 替换target中的请求地址,也就是说在请求http://127.0.0.1:8888/XXXXX这个地址的时候直接写成/api即可。
                }
            }
        }
    }
}

#如果使用前端解决跨域问题,则请求接口地址有变化

this.$axios({
            method: 'get',
            url: 'api/users'
          }).then(response => {
            this.msg = response.data
            console.log(response.data)
          }).catch(error => {
            console.log('error:' + error)
          })
        }

语法校验问题

#去除eslint验证

#在myapp根目录下的.eslintrc.js文件中将 parser: 'babel-eslint' 注释掉即可

#如果找不到.eslintrc.js文件,可以在package.json文件中找到 parser: 'babel-eslint' ,将其注释

#在创建项目的时候有一个询问配置信息的存放位置,这里应该选择 Indedicated config files

module.exports = {
  root: true,
  env: {
    node: true
  },
  'extends': [
    'plugin:vue/essential',
    'eslint:recommended'
  ],
  rules: {
    'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
  },
  parserOptions: {
    // parser: 'babel-eslint'
  }
}
​

启动项目

#进入app-api,运行app.js

node app.js

#浏览器浏览http://localhost:3000/api/users

#进入myapp,启动配置

npm run serve

#浏览器浏览http://localhost:8080

     

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值