安装
首先安装 vue 及 vue-cli,随后安装 express 框架,新版本的 express 创建应用时还需要使用 express-generator,这里一并安装。
npm i -g vue
npm i -g @vue/cli
npm i -g express
npm i -g express-generator
初始化项目
使用 vue-cli 搭建前端框架,选择版本为 vue2 创建。
vue create vue-express-style
cd vue-express-style
npm run serve
访问 localhost:8080 地址,可以看到如下界面:
使用 express-generator 创建后端框架,并设置使用pug模板引擎。
express --view=pug express-style
// Mac OS 或 Linux 系统使用下面的命令创建应用, 或在命令前添加 sudo
DEBUG=express-style:* npm start
// Windows系统在cmd中使用下面的命令
set DEBUG=express-style:* & npm start
// Windows系统在PowerShell中使用下面的命令
$env:DEBUG='express-style:*'; npm start
访问 localhost:3000 地址可以看到如下界面:
开发
后端接口开发
在 express-style > routes 下创建 product.js 文件。
var express = require('express');
var router = express.Router();
router.get('/', function (req, res, next) {
var data = {
code: 200,
data: {name: 'admin', pwd: 'admin'},
isSuccess: true,
msg: "请求成功"
}
res.json(data);
});
module.exports = router;
在 express-style 下找到 app.js 文件,添加内容:
var productRouter = require('./routes/product')
app.use('/product', productRouter)
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
var productRouter = require('./routes/product')
var app = express();
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/product', productRouter)
app.use(function(req, res, next) {
next(createError(404));
});
app.use(function(err, req, res, next) {
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
重启项目,访问地址 localhost:3000/product 可见页面。
前端开发
vue中请求接口数据大部分情况下使用 axios 插件操作,所以先安装此插件,进行配置。
npm i axios
import axios from 'axios'
Vue.prototype.$axios = axios;
在页面中添加 init 方法,使用 axios 访问接口。
<template>
<div class="hello">
<h1>{{ msg }}</h1>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
data(){
return {
msg: ''
}
},
mounted() {
this.init()
},
methods: {
init() {
let self = this;
this.$axios({
method: 'get',
url: '127.0.0.1:3000/product',
}).then(function (res) {
self.msg = res.data;
})
.catch(function (error) {
console.error(error);
})
}
}
}
</script>
注意:这种情况下请求 localhost:8080 是能够发起请求,并且被后端接口响应到的。但是由于 axios 这种请求是 跨域 的,基于 同源策略 前端页面是接收不到数据的。
同源策略会阻止一个域的javascript脚本和另外一个域的能容进行交互。同源(即指在同一个域)就是两个页面具有相同的协议(protocol)、主机(host)和端口号(port)。
问题解决
此刻访问 localhost:8080 模块可以看到请求处于跨域状态,无法获取到数据,我们需要在前端设置代理,解决跨域问题。
axios.defaults.baseURL = '/api/'
axios.interceptors.request.use(config => {
config.headers.Authorization = window.sessionStorage.getItem('token')
return config
})
axios.interceptors.response.use(config => {
return config
})
module.exports = {
publicPath: process.env.NODE_ENV === 'production' ? '/public/' : './',
outputDir: 'dist',
assetsDir: "assets",
productionSourceMap: false,
filenameHashing: false,
lintOnSave: true,
devServer: {
open: true,
host: '0.0.0.0',
port: 8080,
https: false,
hotOnly: false,
proxy: {
'/api': {
target: 'http://127.0.0.1:3000',
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
},
},
},
}
this.$axios({
method: 'get',
url: '/product',
}).then(function (res) {
self.msg = res.data;
})
.catch(function (error) {
console.error(error);
})
重启前后端系统,访问 localhost:8080
参考资料
Axios解决跨域问题 搭建一个VUE+Express前后端分离的开发环境
|