前端Vue后端Express开发学习01

1 篇文章 0 订阅

安装

首先安装 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 地址,可以看到如下界面:

1

使用 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 地址可以看到如下界面:

2

开发

后端接口开发

在 express-style > routes 下创建 product.js 文件。

// product.js
var express = require('express');
var router = express.Router();
// 创建 get 接口
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)
// app.js 完整内容
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();

// view engine setup
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)

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

重启项目,访问地址 localhost:3000/product 可见页面。

3

前端开发

vue中请求接口数据大部分情况下使用 axios 插件操作,所以先安装此插件,进行配置。

npm i axios
// main.js
import axios from 'axios'  // 引入axios
Vue.prototype.$axios = axios;  // 将axios挂载到vue原型上

在页面中添加 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 模块可以看到请求处于跨域状态,无法获取到数据,我们需要在前端设置代理,解决跨域问题。

// main.js 添加
// 配置请求的根路径
axios.defaults.baseURL = '/api/'
// 挂载到原型对象之前 先设置拦截器 通过axios请求拦截器添加token,保证拥有获取数据的权限
axios.interceptors.request.use(config => {
  // 为请求头对象添加Token验证的Authorization字段
  config.headers.Authorization = window.sessionStorage.getItem('token')
  // 最后都必须 return config
  return config
})

axios.interceptors.response.use(config => {
  return config
})
// vue.config.js
module.exports = {
  // 项目部署的基础路径
  // 我们默认你的应用将会部署在域名的根部,比如 https://www.xxx.com/
  // 如果你的应用时部署在一个子路径下,那么你需要在这里指定子路径。
  // 比如,如果你的应用部署在https://www.xxx.com/public/
  // 那么将这个值改为 `/public/`
  // 部署生产环境和开发环境下的URL:可对当前环境进行区分,baseUrl 从 Vue CLI 3.3 起已弃用,要使用publicPath
  /* baseUrl: process.env.NODE_ENV === 'production' ? './' : '/' */
  publicPath: process.env.NODE_ENV === 'production' ? '/public/' : './',
  /* 输出文件目录:在npm run build时,生成文件的目录名称 */
  outputDir: 'dist',
  /* 放置生成的静态资源 (js、css、img、fonts) 的 (相对于 outputDir 的) 目录 */
  assetsDir: "assets",
  /* 是否在构建生产包时生成 sourceMap 文件,false将提高构建速度 */
  productionSourceMap: false,
  /* 默认情况下,生成的静态资源在它们的文件名中包含了 hash 以便更好的控制缓存,你可以通过将这个选项设为 false 来关闭文件名哈希。(false的时候就是让原来的文件名不改变) */
  filenameHashing: false,
  /* 代码保存时进行eslint检测 */
  lintOnSave: true,
  /* webpack-dev-server 相关配置 */
  devServer: {
    /* 自动打开浏览器 */
    open: true,
    /* 设置为0.0.0.0则所有的地址均能访问 */
    host: '0.0.0.0',
    port: 8080,
    https: false,
    hotOnly: false,
    /* 使用代理 */
    proxy: { // string | Object
      '/api': {
        /* 目标代理服务器地址 */
        target: 'http://127.0.0.1:3000',
        /* 允许跨域 */
        changeOrigin: true,
        pathRewrite: {
          '^/api': '' //规定请求地址以什么作为开头
        }
      },
    },
  },
}
// HelloWorld.vue 修改之前的请求地址
this.$axios({
  method: 'get',
  url: '/product',
}).then(function (res) {
  self.msg = res.data;
})
  .catch(function (error) {
    console.error(error);
  })

重启前后端系统,访问 localhost:8080

4

参考资料

Axios解决跨域问题
搭建一个VUE+Express前后端分离的开发环境

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 课程设计-基于Vue+Express实现的新闻聚合网站项目源码+运行说明(含前端+后端).zip 本次项目是Web编程项目demo,为新闻聚合网站(聚合了网易新闻/新浪新闻/新华网/人民网),在此网站中有独立的热搜模块(较为简陋),四个新闻平台热点关键词词云及其数据量,同时您可以在网站中进行筛选搜索,结果会以模态框形式弹出,点击对应的结果即可跳转到对应的新闻原URL,所有结果均为定时爬虫所爬取。 本站使用了Vue3+NaiveUI作为前端框架与组件,使用了Nodejs+Express作为项目后端,阿里云MySQL数据库作为项目数据库。 项目运行 本项目前后端分离,前端为front文件夹,后端为back文件夹,进入前后端文件夹后分别运行 ```shell npm install ``` 下载相应的module文件(如果没有的话) 由于本项目为demo项目,因此并没有做过深的负载等考虑,为开发模式,仅作为演示,因此Vue项目并未打包,均为源码开发模式呈现。 在front文件夹下运行 ```shell npm run serve ``` 启动前端测试(默认运行在8080端口) 在back文件夹下运行 ```shell node main.js ``` 启动服务器(默认运行在8000端口) 然后打开浏览器访问http://localhost:8080/即可测试项目 项目组成 ### 前端 前端为单页面应用,所有交互均以模态框(或类模态框)进行,结构如下: ``` |-- front/src |-- main.js |-- App.vue |-- components | |-- Hot.vue | |-- Display.vue | |-- Result.vue |-- assets | ... ``` 其中App.vue负责整体页面(主页),Hot.vue负责热搜模态框,Display.vue负责展示模态框,Result.vue负责搜索结果展示模态框(包含分页)。 ### 后端 后端由于是第一次写nodejs后端,因此封装或者模块化都比较简陋,以后有兴趣的话可以将后端用Python或Java重写,结构如下: ``` |-- back |-- main.js |-- crawler | |-- common.js | |-- crawler.js | |-- websites | |-- wangyi.js | |-- xinlang.js | |-- xinhua.js | |-- renmin.js | ... ``` 主体部分还是在爬虫上,由于针对不同网站的爬虫会有所不同,因此我将匹配的关键词放在了websites文件夹中的每个js文件中,种子页面处理放在crawler.js中,common.js用来放一些常用模块的二次封装(或者测试的时候可以拿来用,比如我的连接数据库操作是放在main中的,其他地方没有数据库,因此测试某个网站是否成功导入数据库中也可以在common中加入数据库连接操作并exports出来)。 其余定时器,search,热搜,展示的数据均在main.js中生成(这里是由于nodejs不太熟悉不会很好的封装,因此统一整合到了main中)

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值