你的位置:首页 > Java教程

[Java教程]Mongoose使用案例


目录

     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:String12   },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 setupapp.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 handlerapp.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err);});// error handlers// development error handler// will print stacktraceif (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 userapp.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 >  <div >    <div >      <form>        <fieldset>          <legend><%=label%></legend>          <textarea name="editor" id="editor" rows="10" cols="60" <%=(movie?'"movie='+movie+'"':'')%> ></textarea>                </fieldset>        <br>        <button id="save" type="button" >保存</button>      </form>    </div>  </div></div><span id='msg'></span><% include footer.ejs %>

    运行起来看看页面效果 http://localhost:3000

四、插入数据,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 });

     启动浏览器看看效果:

    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/未来警察 ,会返回你刚才入库的数据。

总结

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

     原文地址:http://blog.fens.me/nodejs-mongoose-json/