vue+express+mongoose搭建前后端分离的简单项目

参考资料

参考资料

工作流程

  1. 前后端分离,各自开发。这里前后端分离是这样的:前端用Vue开发静态页面,路由通过Vue-Router进行,后端用Node仅用于编写API给前端调用获取数据。
  2. 前端开发时通过Vue-Cli中提供的proxyTable进行代理,由此可跨域调用Node编写的API。
  3. 前后端各自开发完成,测试无误后,前端通过webpack打包压缩,后端拉取前端打包压缩好的文件即部署完成。

技术栈

  • vue-cli
  • vue-resource
  • node+express
  • mongodb(mongoose)

步骤

以一个简单的登录注册页面为例

1. 安装vue-cli
npm i -g vue-cli
//用淘宝镜像cnpm
复制代码
2. 新建项目
vue init webpack XXX(你想要项目的名字)
复制代码
3. npm install 安装依赖
4. npm run dev

项目跑起来,打开localhost:8080即可看到页面 可在config/index.js中设置打开端口

5. 引入vue-resource

npm install vue-resource --save

然后在main.js中引入

import VueResource from 'vue-resource'

Vue.use(VueResource) 
复制代码
6. 写登录注册页面

LoginView.vue

<template>
  <div>
      <input class="form-control" id="input-email" placeholder="Account name" v-model="account">
      <input type="password" name="form-control" id="input-password" placeholder="Password" v-model="password">
      <button type="submit" class="btn btn-default" @click="login">Sign In</button>
      <button type="submit" class="btn btn-default" @click="register">Register</button>
      <button type="submit" class="btn btn-default" @click="getAllAccount">Get all accounts</button>
  </div>
</template>

<script>
export default {
  data () {
    return {
      account: '',
      password: ''
    }
  },
  methods: {
    login () {
      let params = {
        account: this.account,
        password: this.password
      }
      this.$http.post('/api/user/login', params)
        .then((response) => {
          console.log(response)
          var message = response.body.message
          if (response.body.status === 1000) {
            message = response.body.data[0].account + ' ' + message
          }
          alert(message)
        })
        .catch((reject) => {
          console.log(reject)
        })
    },
    register () {
      let params = {
        account: this.account,
        password: this.password
      }
      this.$http.post('/api/user/register', params)
        .then((response) => {
          console.log(response)
          var message = response.body.message
          if (response.body.status === 1000) {
            message = this.account + ' ' + message
          }
          alert(message)
        })
        .catch((reject) => {
          console.log(reject)
        })
    },
    getAllAccount () {
      console.log('call getAllAccount')
      this.$http.get('/api/user/all')
        .then((response) => {
          console.log(response)
        })
        .catch((reject) => {
          console.log(reject)
        })
    }
  }
}
</script>
复制代码
7. 设置路由

router/index.js如下

import Vue from 'vue'
import Router from 'vue-router'
import LoginView from '@/components/LoginView'

Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'LoginView',
      component: LoginView
    }
  ]
})
复制代码

这时回到浏览器,如无意外应该会出现登录注册界面,当然现在去点击登录按钮请求接口,是不行的。所以我们现在需要去搭建Node

8. 安装好node.js(省略)
9. 在项目的根目录新建一个叫server的目录,用于放置Node的东西。

进入server目录,再新建三个js文件:

  • index.js (入口文件)
  • db.js (设置数据库相关)
  • api.js (编写接口

server目录里安装express

npm install express –save
复制代码
10. index.js文件内容如下
// 引入编写好的api
const api = require('./api'); 
// 引入文件模块
const fs = require('fs');
// 引入处理路径的模块
const path = require('path');
// 引入处理post数据的模块
const bodyParser = require('body-parser')
// 引入Express
const express = require('express');
const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(api);
// 访问静态资源文件 这里是访问所有dist目录下的静态资源文件
app.use(express.static(path.resolve(__dirname, '../dist')))
// 因为是单页应用 所有请求都走/dist/index.html
app.get('*', function(req, res) {
    const html = fs.readFileSync(path.resolve(__dirname, '../dist/index.html'), 'utf-8')
    res.send(html)
})
// 监听3000端口
app.listen(3000);
console.log('success listen 3000');
复制代码
11. db.js

这个js文件主要用于配置mongoDB相关东西,这里使用mongoose 中间件来连接mongoDB,要先在目录内安装mongoose,db.js文件内容如下

/*Schema、Model、Entity或者Documents的关系请牢记,
Schema生成Model,Model创造Entity,
Model和Entity都可对数据库操作造成影响
,但Model比Entity更具操作性。*/

const mongoose = require('mongoose');
// 连接数据库 如果不自己创建 默认test数据库会自动生成
mongoose.connect('mongodb://localhost/test');

// 为这次连接绑定事件
const db = mongoose.connection;
db.once('error',() => console.log('Mongo connection error'));
db.once('open',() => console.log('Mongo connection successed'));
/************** 定义模式loginSchema **************/
const loginSchema = mongoose.Schema({
    account : String,
    password : String
});

/************** 定义模型Model **************/
const Models = {
    Login : mongoose.model('Login',loginSchema)
}

module.exports = Models;
复制代码
11. api.js
// 可能是我的node版本问题,不用严格模式使用ES6语法会报错
"use strict";
const models = require('./db');
const express = require('express');
const router = express.Router();

/************** 创建(create) 读取(get) 更新(update) 删除(delete) **************/

// 创建账号接口
router.post('/api/user/register',(req,res) => {
    // 这里的req.body能够使用就在index.js中引入了const bodyParser = require('body-parser')
    models.Login.find({account: req.body.account}, (err,data) => {
        if (err) {
            console.log(err)
            // res.send(err);
            let newAccount = new models.Login({
                account : req.body.account,
                password : req.body.password
            });
            // 保存数据newAccount数据进mongoDB
            newAccount.save((err,data) => {
                if (err) {
                    res.send({'status': 1001, 'message': 'Fail to register!', 'data': err});
                } else {
                    res.send({'status': 1000, 'message': 'Register successfully!'});
                }
            });
        } else {
            console.log(data)
            if (data.length > 0) {
                res.send({'status': 1001, 'message': 'The account is already registered!'});
            } else {
                let newAccount = new models.Login({
                    account : req.body.account,
                    password : req.body.password
                });
                // 保存数据newAccount数据进mongoDB
                newAccount.save((err,data) => {
                    if (err) {
                        res.send({'status': 1001, 'message': 'Fail to register!', 'data': err});
                    } else {
                        res.send({'status': 1000, 'message': 'Register successfully!'});
                    }
                });
            }
        }
    });

    // let newAccount = new models.Login({
    //     account : req.body.account,
    //     password : req.body.password
    // });
    // // 保存数据newAccount数据进mongoDB
    // newAccount.save((err,data) => {
    //     if (err) {
    //         res.send(err);
    //     } else {
    //         res.send({'status': 1000, 'message': 'Register successfully!'});
    //     }
    // });
});
// 获取已有账号接口
router.post('/api/user/login',(req,res) => {
    // 通过模型去查找数据库
    models.Login.find({account: req.body.account, password: req.body.password}, (err,data) => {
        if (err) {
            // res.send(err);
            res.send({'status': 1001, 'message': 'The account is not existed!', 'data': err});
        } else {
            console.log(data)
            if (data.length > 0) {
                res.send({'status': 1000, 'message': 'Login successfully!', 'data': data});
            } else {
                res.send({'status': 1001, 'message': 'The account is not existed!', 'data': err});
            }
        }
    });
});
// 获取所有账号接口
router.get('/api/user/all',(req,res) => {
    // 通过模型去查找数据库
    models.Login.find((err,data) => {
        if (err) {
            res.send(err);
        } else {
            res.send(data);
        }
    });
});

module.exports = router;
复制代码

后端运行

先启动mongod.exe

进入server目录,输 入node index命令,浏览器输入 http://localhost:3000即显示页面

输入账号和密码,并点击注册,弹出提示框,即注册成功

前端运行

前端端口是8085,后端是3000,故需要跨域处理

proxyTable: {
        '/api': {
            target: 'http://localhost:3000/api/',
            changeOrigin: true,
            pathRewrite: {
              '^/api': ''
        }
      }
    }
复制代码

然后返回项目目录,运行npm start,浏览器输入localhost:8085,即可看到页面,输入刚刚的注册账号和密码,点击登录

部署项目过程中遇到的坑

1.
[HPM] Error occurred while trying to proxy request...
复制代码

有时候遇到这个,并且控制台打印504错误。

我发现是后端端口没打开,进入server目录node index即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值