Fork me on GitHub

vue+node+mongodb实现的页面

源代码地址:https://github.com/GainLoss/vue-node-mongodb

目前这个项目实现的是:

1.利用vue-cli实现前台页面的编写

(1)页面的跳转利用的是vue-router:基本是$.router.push这种方法 还有就是使用命名路由 和动态路由

(2)页面每一部分使用的是组件components:里面涉及的有父子组件之间的数据传递 还有生命周期函数

2.使用vue-resource从后台获取数据

(1)不加参数的传递

(2)加参数的传递

3.使用express编写后台的接口

使用最多的就是路由中间件设计相关的接口

4.mongdb中的Schema和Model

定义每个集合和集合对应的对象 并且连接上数据库 还需要实现对数据库的增删改查

简单实现前后台交互的步骤:

1.下载npm和node;

2.我们前台框架用的是vue所以直接选用vue的脚手架vue-cli;下载安装执行 可以参考:http://www.cnblogs.com/GainLoss/p/6592729.html;

3.到这步我们已经可以用npm run dev打开一个vue的项目了,我们想从后台调取数据就需要编写后台代码和连接上数据库,在这里我们用的是mongodb作为数据库;

4.配置数据库的环境:http://www.cnblogs.com/GainLoss/p/6906937.html 这里面是数据库安装和启动完成

基本界面是:如果想深入了解mongodb:http://www.cnblogs.com/GainLoss/p/7416561.html(这里面是基本的一些操作) 可以直接在Robo 3T中创建集合和数据

需要注意的一点是:有时候直接打开这个连接数据库是连接不上的,因为mongodb没有启动,这时我们需要自己手动启动mongodb

 

5.数据库配置成功,现在需要用node编写后台代码,实现前台可以调取数据库中的数据

(1)在项目根目录下面创建一个文件夹是放置后台代码的取名为server,里面新建三个文件index.js(启动后台代码的入口)db.js(连接数据库,创建模型和对象)api.js(创建后台接口)

db.js

var mongoose=require('mongoose');
//链接数据库
mongoose.connect('mongodb://localhost/test',{ useMongoClient: true });

const db=mongoose.connection;
db.once('error',()=>console.log('链接数据库失败'));
db.once('open',()=>console.log('链接数据库成功'))
//创建模型
const listSchema=mongoose.Schema({
    title:String,
    author:String,
})
//创建对象
const Models={
    list:mongoose.model('list',listSchema,'list'),
}
module.exports=Models;

api.js

//获取到对象
var models=require('./db.js');
//使用node用的是express
var express=require('express');
//用的是路由中间件
var router=express.Router();

router.get('/api/list/showlist',(req,res)=>{
    models.list.find((err,data)=>{
        if(err){
            res.send(err)
        }else{
            res.send(data)
            console.log(data)
        }
    })
})
module.exports=router;

index.js

//引入接口
var api=require('./api');
var fs=require('fs');
var path=require('path');
//bodyParser用于解析客户端请求的body中的内容,内部使用JSON编码处理,url编码处理以及对于文件的上传处理.
var bodyParser=require('body-parser');
var express=require('express');
var app=express();

//将插件放入项目中
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended:false}));
app.use(api);
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)
})
//监听端口
app.listen(8811);
console.log('连接上后台')

这样后台代码基本写完了

6.还有需要代理一下

在config/index.js中

dev: {
    env: require('./dev.env'),
    port: 8812,
    autoOpenBrowser: true,
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {
      '/api': {
        target: 'http://localhost:8811/api',
        changeOrigin: true,
        pathRewrite: {
          '^/api': ''
        }
      }
},

7.执行代码:(执行代码的命令可以查看pckage.json中的scripts,多说一句是packager.json里面有你下载的插件名和版本号)

在当前文件中打开cmd执行npm run dev

在当前文件的server文件夹打开cmd执行node index

遇到的问题和解决方案:

1.如果在mongodb创建一个集合,那么在你添加给这个集合添加数据之后,在数据库中会多一个这个集合名称+s的集合?

解决:在创建model的时候这个写:home:mongoose.model('home',homesSchema,'home') 添加第三个参数 设置为集合的名字 那么添加的数据就会到正确的集合中

2.在父组件给子组件传递一个数值,但是这个数值正好是子组建中http的参数,就有可能出现这种http参数没有获取到的情况?

解决:原因是参数传递和组件渲染顺序是不一致的,这时候可以用vue中的watch监听一下props中message也就是传过来的数据

3.需要注意的是:新版的mongoose可能是会先这种警告:

 (node:2328) DeprecationWarning: `open()` is deprecated in mongoose >= 4.11.0, use `openUri()` instead, or set the `useMongoClient` option

if using `connect()` or `createConnection()`. See http://mongoosejs.com/docs/connections.html#use-mongo-client

这是新版的mongoose出现的错误,解决是mongoose.connect('mongodb://localhost/test',{ useMongoClient: true });

4.一些其他的坑:http://www.cnblogs.com/GainLoss/p/6929299.html

 

 

 

posted @ 2017-06-01 10:31  zhang_yx  阅读(1414)  评论(0编辑  收藏  举报