设为首页 收藏本站
查看: 1095|回复: 0

[经验分享] Mongoose使用案例--让JSON数据直接入库MongoDB

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2017-2-24 08:35:14 | 显示全部楼层 |阅读模式
目录
  1、准备工作。
  2、配置Mongoose。
  3、创建目录及文件。
  4、插入数据,POST提交JSON增加一条记录。
  5、查询数据,取出你插入数据库的记录。

一、准备工作
  使用Express4创建项目,ejs作为视图引擎。

二、配置Mongoose
  1、安装Mongoose类库:npm install mongoose --save。
  2、创建models文件夹,在models文件夹下新建mongodb.js文件。



1 var mongoose=require('mongoose');
2 mongoose.connect('mongodb://localhost:27017/nodejs');
3
4 exports.mongoose=mongoose;

三、创建目录及文件
  1、在models目录,创建数据模型Movie.js,也就是我们通常想扮演的Dao角色。



1 var mongodb=require('./mongodb');
2 var Schema=mongodb.mongoose.Schema;
3
4 var MovieSchema=new Schema({
5     name:String,
6     alias:[String],
7     publish:Date,
8     create_date:{type:Date,default:Date.now},
9     images:{
10         converSmall:String,
11         converBig:String
12     },
13     source:[{
14         source:String,
15         link:String,
16         swfLink:String,
17         quality:String,
18         version:String,
19         lang:String,
20         subtitle:String,
21         create_date:{type:Date,default:Date.now}
22     }]
23 });
24
25
26 var Movie=mongodb.mongoose.model("Movie",MovieSchema);
27 var MovieDao=function(){};
28
29 /*******
30 保存
31 ********/
32 MovieDao.prototype.save=function(obj,callback){
33     var instance=new Movie(obj);
34     instance.save(function(err){
35         callback(err);
36     })
37 }
38 /**
39 按照电影名称精确查询
40 **/
41 MovieDao.prototype.findByName=function(name,callback){
42     Movie.findOne({name:name},function(err,obj){
43         callback(err,obj);
44     });
45 }
46
47 module.exports=new MovieDao();
  2、打开app.js 完善路由地址



var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var routes = require('./routes/index');
var users = require('./routes/users');
var movie=require('./routes/movie');
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
//app.use('/', routes);
//app.use('/users', users);
app.get('/',movie.movieAdd);
app.get('/movie/add',movie.movieAdd);
app.post('/movie/add',movie.doMovieAdd);
app.get('/movie/:name',movie.movieAdd);
app.get('/movie/json/:name',movie.movieJson);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
var err = new Error('Not Found');
err.status = 404;
next(err);
});
// error handlers
// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: err
});
});
}
// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {}
});
});

module.exports = app;
app.listen(3000,function(){
console.log('server begin...');
})
  3、在routes目录增加movie.js



var Movie=require('./../models/Movie.js');
exports.movieAdd=function(req,res){
if(req.params.name){
return res.render("movie",{
title:req.params.name+'|电影|管理|movie.me',
label:'编辑电影'+req.params.name,
movie:req.params.name
});
}else{
return res.render("movie",{
title:'新增加|电影|管理|movie.me',
label:'新增加电影',
movie:false
});
}
}
exports.doMovieAdd=function(req,res){
console.log(JSON.parse(req.body.content));
var json=JSON.parse(req.body.content); //把客户端的Json字符串转化为object
if(json._id){
//update
    }
else{
//insert
Movie.save(json,function(err){
if(err){
res.send({'success':false,'err':err})
}else{
res.send({'success':true})
}
})
}
}
exports.movieJson=function(req,res){
Movie.findByName(req.params.name,function(err,obj){
res.send(obj);
})
}
  4、在views目录,增加movie.ejs视图。



<% include head.ejs %>
<div class="container-fluid">
<div class="row-fluid">
<div class="span8">
<form>
<fieldset>
<legend><%=label%></legend>
<textarea name="editor" id="editor" class="span12" rows="10" cols="60" <%=(movie?'"movie='+movie+'"':'')%> ></textarea>               
</fieldset>
<br>
<button id="save" type="button" class="btn btn-primary">保存</button>
</form>
</div>
</div>
</div>
<span id='msg'></span>
<% include footer.ejs %>
  运行起来看看页面效果 http://localhost:3000
DSC0000.png


四、插入数据,POST提交JSON增加一条记录
  1、基础环境搭建好后,别忘了启动mongodb服务。在这里还有个地方,如果你使用的是express4.0框架,那么从页面向路由里传对象时需要在客户端里用JSON.Stringify序列化对象,然后在路由文件里使用JSON.Parse把字符串转化为对象。本地直接创建一个JSON对象,直接读取这个JSON文件插入数据库。在public/javascripts下创建movie.json。
  创建好JSON文件后,我在本地使用了head.ejs和footer.ejs ,别忘了在footer.ejs里引用要使用的js文件,我这里使用了jquery、bootstrap、jquery.json、movie.js(后面创建)。



{
"name": "未来警察",
"alias": ["Future X-Cops ","Mei loi ging chaat"],
"publish": "2010-04-29",
"images":{
"coverBig":"/img/movie/1_big.jpg",
"coverSmall":"/img/movie/1_small.jpg"
},
"source":[{
"source":"优酷",
"link":"http://www.youku.com",
"swfLink":"http://player.youku.com/player.php/sid/XMTY4NzM5ODc2/v.swf",
"quality":"高清",
"version":"正片",
"lang":"汉语",
"subtitle":"中文字幕"
},{
"source":"搜狐",
"link":"http://tv.sohu.com",
"swfLink":"http://share.vrs.sohu.com/75837/v.swf&topBar=1&autoplay=false&plid=3860&pub_catecode=",
"quality":"高清",
"version":"正片",
"lang":"汉语",
"subtitle":"中文字幕"
}]
}
  2、在public/javascripts目录里增加movie.js作为客户端访问脚本。 客户端初始化时读取json文件。



1 $(function(){
2     var mdata={};
3     var url='/javascripts/movie.json';
4
5     var movie=$('#editor').attr('movie');
6     if(movie){
7         url='/movie/json/'+movie;
8     }
9
10     $.getJSON(url,function(data){
11         mdata=data;
12         render_editor_form(data);
13         render_event_form();
14     });
15
16     var render_editor_form=function(data){
17         $('#editor').val($.toJSON(data));
18     };
19
20     var render_event_form=function(){
21     $('#save').on('click',function(event){
22         var data={};
23         data.content=JSON.stringify(mdata);
24         $.ajax({
25             type:'POST',
26             url:'/movie/add',
27             dataType:'json',
28             data:data,
29             success:function(data,status){
30                 if(data.success){
31                     $('#msg').html('保存成功');
32                     $('#msg').addClass('href','/movie/'+data.name);
33                 }else{
34                     $('#msg').html(data.err);
35                     $('#msg').addClass('alert alert-error');
36                 }
37             }
38         });
39     });
40   };
41 });
  启动浏览器看看效果:
DSC0001.png

  3、在models目录增加Movie.js 也就是我们操作数据库的地方,增加save()。



/*******
保存
********/
MovieDao.prototype.save=function(obj,callback){
var instance=new Movie(obj);
instance.save(function(err){
callback(err);
})
}

  4、在routes/movie.js里调用save()



exports.doMovieAdd=function(req,res){
console.log(JSON.parse(req.body.content));
var json=JSON.parse(req.body.content); //把客户端的Json字符串转化为object
if(json._id){
//update
    }
else{
//insert
Movie.save(json,function(err){
if(err){
res.send({'success':false,'err':err})
}else{
res.send({'success':true})
}
})
}
}
  页面启动起来,直接点击保存按钮,查看报文,插入成功后会返回success:true。插入成功后你可以用DOS命令来检查,也可以用可视化工具来查看,后面在页面里调用也可以。

五、查询数据,取出你插入数据库的记录
  1、在models/Movie.js里增加findByName()用来查看你刚才插入数据库的记录,这里使用电影名称来查看。



/**
按照电影名称精确查询
**/
MovieDao.prototype.findByName=function(name,callback){
Movie.findOne({name:name},function(err,obj){
callback(err,obj);
});
}
  2、在routes/movie.js里调用findByName()



1 exports.movieJson=function(req,res){
2     Movie.findByName(req.params.name,function(err,obj){
3         res.send(obj);
4     })
5 }
  
      写完调用后,你可以在浏览器里输入http://localhost:3000/movie/json/未来警察 ,会返回你刚才入库的数据。
DSC0002.png


总结
  使用Mongodb我发现最灵活的莫过于数据结构了,原文是用的express3,然后我做的时候用的express4,在路由里使用req.body.content提示undefined。后来查询因为Express版本的时,所以就用了JSON.Stringify和JSON.parse()。
  原文地址:http://blog.fens.me/nodejs-mongoose-json/

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-346376-1-1.html 上篇帖子: Node.js、express、mongodb 入门(基于easyui datagrid增删改查) 下篇帖子: 2015-2016前端知识体系
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表