Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析


Posted in Javascript onDecember 20, 2019

本文实例讲述了Vue+Node服务器查询Mongo数据库及页面数据传递操作。分享给大家供大家参考,具体如下:

1、利用Mongoose查询MongoDB

通过mongoose依赖可以简捷地操作mondodb数据库,首先安装mongoose:

cnpm install mongoose --save

使用mongoose需要一个模式Schema,它用于定义你从mongodb中查询的每个文档条目的内容,然后通过mongoose.model()生成一个模板model,模板像一个架子,将数据库取到的每个条目中的内容按架子的结构填充,这样就形成了一个便于操作、结构条理的数据对象。通过这个对象就可以访问模板的相关属性,甚至为其定义函数方法。

例如mongodb中的数据库mall中的商品条目如图:

Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析

(PHP Storm中有简单的mongo可视化插件。通过搜索mongo plugin安装该插件,之后在phpstorm主菜单的view/Tool Windows中找到mongo explore开启mongo侧边栏工具,并连接到mongo数据库后就能可视化查看其中数据)

针对其定义Schema,生成并导出商品模板goods:

//在服务端server/modules文件夹下新建goods.js文件
const mongoose=require('mongoose');  
let Schema=mongoose.Schema;      
let productSchema=new Schema({     //通过mongoose的Schema定义模板
 "productId":String,
 "productName":String,
 "salePrice":Number,
 "productImage":String
});
//导出模板goods
module.exports=mongoose.model('goods',productSchema);

注意:Schema中字段的名称要与数据库中一致,否则会因为字段不匹配而造成无法操作数据库。例如我在数据库中是productImage,而schema中是productImg,导致插入时丢失字段。

然后通过goods模板执行数据库查询操作,如果有错返回err,否则返回查询结果doc:

goods.find({},(err,doc)=>{callback()});

2、Node服务端查询数据库并返回结果

①、通过Express框架进行数据库连接:

//服务端server/routes/goods.js文件
//引入相关模块
const express=require('express');
const router=express.Router();
const mongoose=require('mongoose');
const goods=require('../modules/goods')  //引入goods模板
//连接本地mongodb数据库的mall集合
mongoose.connect('mongodb://localhost:27017/mall');
mongoose.connection.on('connected',()=>{
 console.log("mongoDB连接成功");
});
mongoose.connection.on('erroe',()=>{
 console.log("mongoDB连接出错");
});
mongoose.connection.on('disconnected',()=>{
 console.log("mongoDB断开连接");
});

②、对来自前端的get请求进行响应:查询数据库mall集合并将结果放在result.list中,再加上status、msg,以json形式返回res。

router.get('/',(req,res,next)=>{
 //利用goods模板调用mongooseAPI进行数据库查询
 goods.find({},(err,doc)=>{    //查询的回调函数
  "use strict";
  if (err){
   res.json({
    status:1,
    msg:err.message
   })
  }else {
   res.json({//利用res将数据返回给get请求
    status:0,
    msg:'',
    result:{
     count:doc.length,
     list:doc
    }
   })
  }
 })
});

最后记得暴露路由router

module.exports = router;

注:接收请求中的参数一般有三种方式,

  • req.query多用于get请求发送来的数据,参数以?加在请求路径的尾部,用req.query.keyname可以获取到其中的数据。
  • req.body用于接收post请求,post请求将数据放在request正文中,因此req.body.keyname可以得到其请求数据。
  • req.params的参数包含在路径当中,例如请求路径为http://localhost:3000/test/myparam,在服务端读取其中的参数;
router.get('/testparams/:param', function (req, res) {
  console.log('参数为: ' + req.params.param);  //控制台输出路径中的参数:myparam
})

3、跨域请求数据

由于本地Vue运行在localhost:8080,而Node在localhost:3000,若要在vue中利用axios实现数据请求,则需要执行跨域代理操作。在vue中的config/index.js文件的dev中配置一个转发代理,当请求"/goods"时,转发到localhost:3000下的/goods:

Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析

Node服务器对get请求的解析过程:当请求到达localhost:3000端时,Node服务器的app.js文件对请求路径进行解析,通过app.use()将/goods定位到routes/goods.js文件,在该文件中查询数据库的操作并返回结果:

var goods=require('./routes/goods');  //包含文件routes/goods.js
app.use('/goods',goods);        //将访问路径定位到文件

4、vue进行数据请求并渲染到页面

在views/GoodsList.vue文件中利用axios对数据进行请求,定义getGoodsList()方法并在挂载后调用:

mounted:function (){
  this.getGoodsList();
 },
 methods:{
  getGoodsList(){
   axios.get("/goods").then(response =>{
    let res=response.data;
    if(res.status==0){
     this.goodsList=res.result.list;
    }else{
     console.log("从服务器请求数据失败!");
    }
   })
  },

通过axios的get请求/goods,由于上面做了跨域代理,可以向Node服务端发送请求,在回调函数中,response的data是响应返回的实际内容,我们在服务端定义了返回状态status,为0代表正常,并且将数据放在了result.list中,在页面中对list数组进行遍历即可将数据渲染到页面:

注意在遍历每个数据对象时,其键名要与在mongoDB中的定义一致,如item.salePrice可以访问到条目的价格

<li v-for="(item,index) in goodsList">
  <div class="pic">
    <a href="#" rel="external nofollow" ><img v-lazy="`static/${item.productImage}`" alt=""></a>
  </div>
  <div class="main">
    <div class="name">{{item.productName}}</div>
    <div class="price">{{item.salePrice}}</div>
    <div class="btn-area">
      <a href="javascript:;" rel="external nofollow" class="btn btn--m">加入购物车</a>
    </div>
  </div>
</li>

启动mongoDB、Node服务端、运行vue-cli框架后即可在localhost:8080内看到结果如图:

Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
图片之间的切换
Jun 26 Javascript
JavaScript 在线压缩和格式化收藏
Jan 16 Javascript
一些常用的JavaScript函数(json)附详细说明
May 25 Javascript
Ionic实现仿通讯录点击滑动及$ionicscrolldelegate使用分析
Jan 18 Javascript
js 判断一组日期是否是连续的简单实例
Jul 11 Javascript
利用jquery实现验证输入的是否是数字、小数,包含保留几位小数
Dec 07 Javascript
Bootstrap下拉菜单样式
Feb 07 Javascript
jQuery EasyUI ProgressBar进度条组件
Feb 28 Javascript
详谈js使用in和hasOwnProperty获取对象属性的区别
Apr 25 Javascript
jQuery序列化后的表单值转换成Json
Jun 16 jQuery
pace.js和NProgress.js两个加载进度插件的一点小总结
Jan 31 Javascript
微信小程序实现录音Record功能
May 09 Javascript
node使用request请求的方法
Dec 20 #Javascript
Vue filter 过滤当前时间 实现实时更新效果
Dec 20 #Javascript
使用JavaScript计算前一天和后一天的思路详解
Dec 20 #Javascript
js正则匹配多个全部数据问题
Dec 20 #Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 #Javascript
Vuex实现数据共享的方法
Dec 20 #Javascript
React 实现车牌键盘的示例代码
Dec 20 #Javascript
You might like
一周让你学会PHP 不错的学习资料
2009/02/06 PHP
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
如何在symfony中导出为CSV文件中的数据
2011/10/06 PHP
非常实用的php弹出错误警告函数扩展性强
2014/01/17 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结
2019/10/10 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
jQuery拖拽div实现思路
2014/02/19 Javascript
处理文本部分内容的TextRange对象应用实例
2014/07/29 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
javascript中AJAX用法实例分析
2015/01/30 Javascript
jQuery模拟物体自由落体运动(附演示与demo源码下载)
2016/01/21 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
Node.js调试技术总结分享
2017/03/12 Javascript
浅谈React + Webpack 构建打包优化
2018/01/23 Javascript
浅谈webpack devtool里的7种SourceMap模式
2019/01/14 Javascript
微信小程序新闻网站详情页实例代码
2020/01/10 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
[42:25]2018DOTA2亚洲邀请赛 4.5 淘汰赛 LGD vs Liquid 第三场
2018/04/06 DOTA
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
2017/09/24 Python
Linux CentOS7下安装python3 的方法
2018/01/21 Python
Flask框架实现给视图函数增加装饰器操作示例
2018/07/16 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
Python小程序 控制鼠标循环点击代码实例
2019/10/08 Python
清华大学自主招生自荐信
2014/01/29 职场文书
二年级班级文化建设方案
2014/05/10 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
绿色环保口号
2014/06/12 职场文书
2015年语文教研组工作总结
2015/05/23 职场文书
基层党建工作简报
2015/07/21 职场文书
解决hive中导入text文件遇到的坑
2021/04/07 Python
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android
《杜鹃的婚约》OP主题曲「凸凹」无字幕影像公开
2022/04/08 日漫
MySql按时,天,周,月进行数据统计
2022/08/14 MySQL