Mongoose使用案例–让JSON数据直接入库MongoDB

为什么用Nodejs?为什么用MongoDB?从领域语言和代码简洁之道来看,这是我非常关心的问题。

Nodejs基于Javascript,MongoDB脚步同样也是基于Javascript。而且他们的数据存储格式都是JSON,这就是为什么要把他们放在一起的原因了。如果程序前后端能直接处理JSON,我想数据处理过程又可以极大的减化了,代码量又将低少1/5。多么的兴奋啊!让我们来动手验证一下想法吧。

关于作者:

  • 张丹(Conan), 程序员Java,R,PHP,Javacript
  • weibo:@Conan_Z
  • blog: http://blog.fens.me
  • email: bsspirit@gmail.com

转载请注明出处:
http://blog.fens.me/nodejs-mongoose-json/

程序代码已经上传到github有需要的同学,自行下载。
https://github.com/bsspirit/nodejs-demo

本文重点介绍web前端通过JQuery发起POST提交JSON数据,通过Mongoose直接插入或更新到MongoDB。

工程目录沿用nodejs-demo,增加/mongoose路径及对应文件。

关于nodejs-demo项目介绍,请参考文章:

Nodejs开发框架Express3.0开发手记–从零开始
http://blog.fens.me/nodejs-express3/

nodejs2

从零开始nodejs系列文章

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!

 

文章目录

  1. 配置Mongoose
  2. 创建目录及文件
  3. 插入数据,POST提交JSON增加一条记录
  4. 查询数据,取出刚增加的记录

1. 配置Mongoose

增加mongoose的类库


cd d:/workspace/project/nodejs-demo
npm install mongoose

D:\workspace\project\nodejs-demo\node_modules\mongoose\node_modules\mongodb\node_modu
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Microsoft.Cpp.InvalidPlatform.Targe
e_modules\mongodb\node_modules\bson\build\bson.vcxproj]
mongoose@3.6.10 node_modules\mongoose
├── muri@0.3.1
├── hooks@0.2.1
├── sliced@0.0.3
├── mpath@0.1.1
├── ms@0.1.0
├── mpromise@0.2.1 (sliced@0.0.4)
└── mongodb@1.3.3 (kerberos@0.0.2, bson@0.1.8)

安装时,有64位兼容性错误提示没关系,Mongoose类库安装完成。

增加models目录
mkdir models

在models目录,增加mongodb.js文件


var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/nodejs');
exports.mongoose = mongoose;

指定Mongo的数据库名为nodejs

2.创建目录及文件

在models目录,增加数据模型Movie.js


var mongodb = require('./mongodb');
var Schema = mongodb.mongoose.Schema;
var MovieSchema = new Schema({
name : String,
alias : [String],
publish : Date,
create_date : { type: Date, default: Date.now},
images :{
coverSmall:String,
coverBig:String,
},
source :[{
source:String,
link:String,
swfLink:String,
quality:String,
version:String,
lang:String,
subtitle:String,
create_date : { type: Date, default: Date.now }
}]
});
var Movie = mongodb.mongoose.model("Movie", MovieSchema);
var MovieDAO = function(){};
module.exports = new MovieDAO();

指定Mongo的数据库集为Movie

数据类型,包括了String,Date,Array,Mixed]

打开app.js增加访问路径


var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, movie = require('./routes/movie')
, http = require('http')
, path = require('path')
, ejs = require('ejs')
, SessionStore = require("session-mongoose")(express);
...
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);//JSON数据

在routes目录,增加movie.js


var Movie = require('./../models/Movie.js');
exports.movieAdd = function(req, res) {
if(req.params.name){//update
return res.render('movie', {
title:req.params.name+'|电影|管理|moive.me',
label:'编辑电影:'+req.params.name,
movie:req.params.name
});
} else {
return res.render('movie',{
title:'新增加|电影|管理|moive.me',
label:'新增加电影',
movie:false
});
}
};
exports.doMovieAdd = function(req, res) {
res.send({'success':true});
};

在views目录,增加movie.html


<% include header.html %>
<div class="container-fluid">
<div class="row-fluid">
<div class="span8">
<form>
<fieldset>
<legend><%=label%></legend>
<textarea id="c_editor" name="c_editor" class="span12" rows="10"></textarea>
<button id="c_save" type="button" class="btn btn-primary">保存</button>
</fieldset>
<form>
</div>
</div>
</div>
<% include footer.html %>

网页效果:http://localhost:3000/movie/add

movieInsert

3. 插入数据,POST提交JSON增加一条记录

基础环境,都搭建好后,我们开台准备向mongodb中插入数据。

首先创建一个json数据文件,这样我们可以方便点,直接读入这个文件,创建JSON数据对象了。

在public/javascripts/目录,增加movie.json文件


{
"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":"中文字幕"
}]
}

在public/javascripts/目录,增加jquery.json-2.4.js类库


<script src="/javascripts/jquery-1.9.1.min.js"></script>
<script src="/javascripts/bootstrap.min.js"></script>
<script src="/javascripts/jquery.json-2.4.js"></script>
<script src="/javascripts/movie.js"></script>
</body>
</html>

在public/javascripts/目录,增加movie.js文件,作为前端脚本


$(function() {
var mdata={};
var url = '/javascripts/movie.json';
$.getJSON(url, function(data) {
mdata=data;
render_editor_form(mdata);
render_event_form(mdata);
});
var render_editor_form=function(data){
$('#c_editor').val($.toJSON(data));
};
var render_event_form=function(){
$('#c_save').on('click',function(event){
var data = {};
data['content'] = mdata;
$.ajax({
type: "POST",
url: '/movie/add',
data: data,
success: function (data, textStatus){
if(data.success){
$('#msg').html('成功保存!');
$('#msg').addClass('alert alert-success');
$(location).attr('href','/movie/'+mdata.name);
} else {
$('#msg').html(data.err);
$('#msg').addClass('alert alert-error');
}
}
});
});
};
});

修改views/footer.html,增加movie.js文件引用,同时增加jquery.json包


<script src="/javascripts/jquery-1.9.1.min.js"></script>
<script src="/javascripts/bootstrap.min.js"></script>
<script src="/javascripts/jquery.json-2.4.js"></script>
<script src="/javascripts/movie.js"></script>
</body>
</html>

网页效果:http://localhost:3000/movie/add

movieInsert2

在models/Movie.js,增加save方法


MovieDAO.prototype.save = function(obj, callback) {
var instance = new Movie(obj);
instance.save(function(err){
callback(err);
});
};

在routes/movie.js,调用save方法


exports.doMovieAdd = function(req, res) {
console.log(req.body.content);
var json = req.body.content;
if(json._id){//update
} else {//insert
Movie.save(json, function(err){
if(err) {
res.send({'success':false,'err':err});
} else {
res.send({'success':true});
}
});
}
};

控制台日志


Express server listening on port 3000
{ 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_ca
quality: '高清',
version: '正片',
lang: '汉语',
subtitle: '中文字幕' } ] }
POST /movie/add 200 57ms - 21b

数据已插入MongoDB

movieInsert3

4. 查询数据,取出刚增加的记录

models/Movie.js,增加findByName方法


MovieDAO.prototype.findByName = function(name, callback) {
Movie.findOne({name:name}, function(err, obj){
callback(err, obj);
});
};

routes/movies.js,增加movieJSON


exports.movieJSON = function(req, res) {
Movie.findByName(req.params.name,function(err, obj){
res.send(obj);
});
}

前端javascripts/movie.js,从/movie/json/xxx处取数据


var mdata={};
var url = '/javascripts/movie.json';
var movie=$('#c_editor').attr('movie')
if(movie){
url = '/movie/json/'+movie;
}

修改 views/movie.html


<textarea id="c_editor" name="c_editor" rows="10" <%= (movie?'"movie='+movie+'"':'') %>></textarea>

访问我们的网页

http://localhost:3000/movie/未来警察

movieInsert4

数据从/movie/json/未来警察,处读取。完成尝试。

修改操作与插入的操作类似,我就不做演示了。

希望此文对大家有所帮助。

以上程序代码,我已经上传到github有需要的同学,自行下载。
https://github.com/bsspirit/nodejs-demo

转载请注明出处:
http://blog.fens.me/nodejs-mongoose-json/

打赏作者

This entry was posted in Javascript语言实践

0 0 votes
Article Rating
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

90 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
youxiachai

mongodb 用的是那种客户端查看的?

[…] 文章正文:http://blog.fens.me/nodejs-mongoose-json/ […]

[…] Mongoose使用案例–让JSON数据直接入库MongoDB […]

memotail

请问,你用什么mongodb的可视化客户端?怎么我找不到

Conan Zhang

robomongo

Yj Chen

请问下我下了robomongo之后,autorization不填就出现Authorization skipped by you错误,Authorization failed,说要用户名和密码,可我下mongodb时不记得有注册什么用户名和密码!谢 谢

Conan Zhang

你好,我没有发现这个问题。
如果需要访问密码,应该是你自己设置的,可以通过命令行修改密码。

另外,确认一下,你启动mongo的命令是否包括 -auth 参数。

dada

教程中的一开始的app.js你就添加了app.get(‘/movie/json/:name’,movie.movieJSON);//JSON数据

而紧接着的routes里面并还没开始写movieJSON这个方法的,一开始按照教程走的时候总报错,让我费解了半天,让后在一点点看代码才发现的,还请作者更正一下,或者后面的新手学习者多加注意!!

Conan Zhang

在第4部分”查询数据,取出刚增加的记录“,有”routes/movies.js,增加movieJSON”。

是不是靠后面了,所以出现了你的问题?

毛孩 王

确实这样的:
app.get(‘/movie/json/:name’,movie.movieJSON);//JSON数据
这个不能先放上去,我也是一点点的看代码才找到问题的。
我想后面的学习先看回复会好一些,

lwbjing

丹哥,我问个问题。我用express mongoose操作mongoDB的时候碰到个问题。比如我连接的是user的集合,读取不到数据,然后往里面插入一条数据,再回去mongodb终端看,数据库里新创建了个users的集合,,然后我测试了下,随便连接个集合,create一条数据,数据库里就会生成个当前连接集合名加个s的集合,而不是当前的集合名,求教为啥。(express项目里装有mongoose及express-mongoose)

Conan Zhang

检查程序吧,应该是程序错误。先找例子模仿,在例子上改。

环

丹哥,我按照上面的步骤来,不知道啥原因出了ReferenceError: movie is not defined
的错误

Conan Zhang

查看留言的内容,有解释。

环

好的,谢谢~~请问Ubuntu下的mongodb有什么可视化工具么?

Conan Zhang

可视化有很多的工具,你找一下哪一个能在Ubuntu下面用。
http://docs.mongodb.org/ecosystem/tools/administration-interfaces/

lxh

我也有同样的问题,请在这里答复!

Conan Zhang

在第4部分”查询数据,取出刚增加的记录“,有”routes/movies.js,增加movieJSON”。

清晨

保存的时候出这个错。帮忙看下。

Conan Zhang

给你回邮件了。

Listen

GET /javascripts/movie.json 304 1ms

undefined

TypeError: Cannot read property ‘_id’ of undefined

at exports.doMovieAdd (E:nodejsworkspaceprojectnodejs-demoroutesmovie.

js:40:8)

at callbacks (E:nodejsworkspaceprojectnodejs-demonode_modulesexpressl

ibrouterindex.js:164:37)

at param (E:nodejsworkspaceprojectnodejs-demonode_modulesexpresslibr

outerindex.js:138:11)

at pass (E:nodejsworkspaceprojectnodejs-demonode_modulesexpresslibro

uterindex.js:145:5)

at Router._dispatch (E:nodejsworkspaceprojectnodejs-demonode_modulesex

presslibrouterindex.js:173:5)

at Object.router (E:nodejsworkspaceprojectnodejs-demonode_modulesexpre

sslibrouterindex.js:33:10)

at next (E:nodejsworkspaceprojectnodejs-demonode_modulesexpressnode_m

odulesconnectlibproto.js:193:15)

at Object.req.session.error [as handle] (E:nodejsworkspaceprojectnodejs-

demoapp.js:44:1)

at next (E:nodejsworkspaceprojectnodejs-demonode_modulesexpressnode_m

odulesconnectlibproto.js:193:15)

at Object.session [as handle] (E:nodejsworkspaceprojectnodejs-demonode_

modulesexpressnode_modulesconnectnode_modulesexpress-sessionindex.js:215:2

9)

POST /movie/add 500 12ms

严格按照操作步骤来的,说是json中的_id参数无效,是怎么回事呢,数据库的Movie.js文件没有加载吗?我看了是加载的啊。。。求解。。。

Listen

exports.doMovieAdd = function(req, res) {

console.log(req.body.content);

var json = req.body.content;

if(json._id){//update

} else {//insert

Movie.save(json, function(err){

if(err) {

res.send({‘success’:false,’err’:err});

} else {

res.send({‘success’:true});

}

});

}

};

调用的是这个方法

Listen

大家好,楼主好,是我自己手写javascripts/movie.js的时候js写的有问题,没有复制楼主的js代码,我是看着一行一行写的,所以出了差错,我把楼主的代码覆盖我的代码之后就可以正常执行了,在此说明一下

Conan Zhang

呵呵,解决就好!

malin

楼主,你这段代码在我本地跑有点问题我是window7系统不知道是不是这个原因
<textarea id="c_editor" name="c_editor" rows="10" >

我用Chrome看了下源代码 movie属性有点问题取不到值改成
<textarea id="c_editor" name="c_editor" rows="10" >

这样就能取到movie的值了。

Conan Zhang

三目运行符 test?true:false,应该是没有错的,你试调试一下你的程序吧。

彭玉松

运算符确实没错,但是好像显示的时候引号出现了问题,你的代码好像是能查询,其实movieJSON里面根本没有执行,也就是说没有查询。问题在于引号把属性值movie都盖起来了,根本就获取不到movie属性。而且这样写的话引号在渲染页面之后是",而不是’ ” ‘ ,这样查询的时候查不到,文本框会变成空的,希望楼主能改一下代码……我直接把代码中的引号删除了,这样可以查到。

pengyusong

最后我想问一个问题就是,怎么让那个该死的"在渲染页面之后是 ” ?

彭玉松

第一个是:",这博客居然可以解释评论里面的特殊字符……不怕被攻击吗

彭玉松

我擦,是&-quot;,中间的’-‘去掉

彭玉松

刚尝试了一下用可以实现

Conan Zhang

评论系统是外挂的,博客本身不会受到攻击的。

彭玉松

最重要的不同就是我查出来的结果是带有_id的内容的。楼主的代码好像就是JSON文件里面的内容,根本没有刷新。到之后以为查找到了的感觉。

Lexus Lumia

你好,MongoDB不是schema free的吗?为什么还要先建立模式呢?

Conan Zhang

1. schema free不代表,就不需要定义schema。
2. 业务模型通常是要进行描述的,不然存什么自己都不知道。
2. 另外,schema为是定义JSON模板,如果每次插入修改都需要自己,拼接JSON是很麻烦的。

zhaochong

请问一下,mongodb如何实现id自增?

Conan Zhang

每条记录都会有一个_id字段,是ObjectID类型的不是数字类型,不用手动插入默认为生成。

fwon

启动robomongo后无法看到movies的数据,请问要db是什么时候创建的呢,好像文章中没有提及呀

celleychen

您好,问一下,我直接运行您的代码,但是保存新添加电影的时候没有返回保存成功信息。我看了一下,render_event_form好像没有进去而是跳到了jquery-1.9.1.min.js
为什么呢?

Conan Zhang

你这样的描述太抽象了,代码本身不难,试试自己修改一下。

pengyusong

因为html里面没有id为msg的元素。看客户端的move.js中的代码是会在html页面中id为msg的元素中显示成功保存,但是html页面并没有该元素。你可以添加这个元素,但是点击保存之后会立即跳转到另外一个url:/movie/未来警察。所以该信息会一闪而过。

rong_fan

你好,我想问一下你是怎么解决中文显示乱码问题的啊,我每次都要把js文件重新编码为UTF-8才行。觉得这样好麻烦的。

Conan Zhang

所有程序文件或存储都统一用UTF-8编码,就没有编码问题了。

rong_fan

我想问一下修改操作,json._id,这个_id就是对应数据库那条记录的主键吗?我对mongoDB还不太熟,你能推荐一些学习mongoDB的链接吗?谢啦!!

rong_fan

更新怎么写啊,试了一下结果全是insert。
MovieDAO.prototype.update = function(obj, callback) {
var instance = new Movie(obj);
instance.update({_id:obj._id},function(err){
callback(err);
});
};

[…] 数据库:mysql,mongoose,redis […]

chock zhu

连接上一个不存在的数据库,当我向那个库插入数据的时候,会自动创建那个库吗?

Conan Zhang

应该会自动创建的,试一下就知道了

Bing

POST http://localhost:3000/movie/add 500 (Internal Server Error) jquery-2.1.0.min.js:4o.ajaxTransport.l.cors.a.crossDomain.send jquery-2.1.0.min.js:4o.extend.ajax jquery-2.1.0.min.js:4(anonymous function) movie.js:16o.event.dispatch jquery-2.1.0.min.js:3o.event.add.r.handle jquery-2.1.0.min.js:3

丹哥 我在save的时候出现了一个这个错误,在 call ajax的时候

$.ajax({
type: “POST”,
url: ‘/movie/add’,
data: data,
success: function (data, textStatus){
。。。

整不明白呀,求教一下

Bing

console.log(req.body);
var json = req.body;

我用的是 node 4 改完了这个后能运行了

Conan Zhang

由于大家的环境都是不一样的,需要自己花更多时间调试。

Conan Zhang

node4? express4?

你的日志中,怎么提示跨域访问的错误
o.ajaxTransport.l.cors.a.crossDomain.send

Zida Shaw

谢谢,最近在做相关方面的工作。过来学习了。

周建文

請問,在儲存時,會出現Cannot use ‘in’ operator to search for ‘_id’ in {“name”…,出錯的是var instance = new Movie(obj);,可以幫我解決嗎?

Conan Zhang

你把你的代码中的 in 去掉,这里出错了。

章小慢

属性这里引号用的有点问题哈.. github 上代码改下呗..

ziyun

我这个是一步一步来的,不知道为什么,这个就是数据存不到mongodb中

TypeError: Cannot read property ‘ref’ of undefined
at model.Document.set (C:Program Filesnodejspraticenodejs-demonode_modulesmongooselibdocument.js:454:74)
at model.Document (C:Program Filesnodejspraticenodejs-demonode_modulesmongooselibdocument.js:60:10)
at model.Model (C:Program Filesnodejspraticenodejs-demonode_modulesmongooselibmodel.js:43:12)
at new model (C:Program Filesnodejspraticenodejs-demonode_modulesmongooselibmodel.js:2535:11)
at MovieDAO.save (C:Program Filesnodejspraticenodejs-demomodelsMovie.js:27:20)
at exports.doMovieAdd (C:Program Filesnodejspraticenodejs-demoroutesmovie.js:25:15)
at callbacks (C:Program Filesnodejspraticenodejs-demonode_modulesexpresslibrouterindex.js:161:37)
at param (C:Program Filesnodejspraticenodejs-demonode_modulesexpresslibrouterindex.js:135:11)
at pass (C:Program Filesnodejspraticenodejs-demonode_modulesexpresslibrouterindex.js:142:5)
at Router._dispatch (C:Program Filesnodejspraticenodejs-demonode_modulesexpresslibrouterindex.js:170:5)

mrpant

想问下博主,mongodb 的写入回滚和类似mysql的左连接该怎么实现啊

Conan Zhang

1. mongodb对于事务支持并不好,事务操作就不要考虑用MongoDB了。

从官方文档查到,对于单库有这种原子性的支持。
http://docs.mongodb.org/manual/core/write-operations-atomicity/

2. 左连接,MongoDB是不支持join的。所以遇到这种操作的时候,你需要做两次查询。

对于复杂的join,我建议在设计的Collection的结构的时候就想好,尽量避免join操作。

ppttnn

> bson@0.2.21 install /Volumes/ppttnn/Develop/www/microblog/node_modules/mongoose/node_modules/mongodb/node_modules/mongodb-core/node_modules/bson

> (node-gyp rebuild 2> builderror.log) || (exit 0)

mac 安装时 出现这个是什么个情况?

Conan Zhang

好像是bson这个库安装的问题;你需要再查一下文档,只是这个库通常要动手安装。我没有用过Mac。

lipn

我在app.js中加入了 var movie = require(“./routes/movie”);
报这个错:
F:nodenode-06node_modulesexpresslibrouterroute.js:170

throw new Error(msg);

^

Error: Route.get() requires callback functions but got a [object Undefined]

at Route. (F:nodenode-06node_modulesexpresslibrouterroute.

js:170:15)

at Array.forEach (native)

at Route.(anonymous function) [as get] (F:nodenode-06node_modulesexpress

librouterroute.js:166:15)

at EventEmitter.app.(anonymous function) (F:nodenode-06node_modulesexpre

sslibapplication.js:465:19)

at Object. (F:nodenode-06app.js:61:5)

at Module._compile (module.js:460:26)

at Object.Module._extensions..js (module.js:478:10)

at Module.load (module.js:355:32)

at Function.Module._load (module.js:310:12)

at Module.require (module.js:365:17)

Conan Zhang

你是用的express 3.x 吗?

mao

我的也是这个报错,用的是express 3.x,想请教下楼主怎么解决

Kevin

一直遇到这种情况,不知道是怎么回事,有朋友遇到过类似的情况么

D:node_casenode_testnode_modulesexpresslibexpress.js:89
throw new Error(‘Most middleware (like ‘ + name + ‘) is no longer bundle
^
Error: Most middleware (like session) is no longer bundled with Express and must be installed separately. Please see https://github.com/senchalabs/connect#middleware.
at Function.Object.defineProperty.get (D:node_casenode_testnode_modulesexpresslibexpress.js:89:13)
at module.exports (D:node_casenode_testnode_modulessession-mongooseindex.js:266:15)
at Object. (D:node_casenode_testapp.js:8:45)
at Module._compile (module.js:460:26)
at Object.Module._extensions..js (module.js:478:10)
at Module.load (module.js:355:32)
at Function.Module._load (module.js:310:12)
at Module.require (module.js:365:17)
at require (module.js:384:17)
at Object. (D:node_casenode_testbinwww:7:11)

Conan Zhang

本文是基于express 3.x的,如果你用新版本要升级。express 4.x的配置,请参考文章:http://blog.fens.me/nodejs-express4/

boring

POST http://localhost:3000/movie/add 500 (Internal Server Error) 提交的时候出现这个错误

天宇

UserDAO.prototype.findByUserName = function (username,callback) {
User.findOne({‘username’: username}, function (err, obj) {
callback(err, obj);
});
};

非常感谢您的分享。我很少写js。您的帖子对我帮助非常大。谢谢。
这里有个问题,您原帖中为{name:name},是不是应该改成{‘name’:name}.因为我是第一次正经写js。这个小地方困扰我很久。

严杰

有一个问题,浏览器端脚本 movie.js 中 ajax 提交的date数据为JSON类型的非String类型(见第一张图),这样的话,浏览器提交时,会解析成一种特别的格式(见第二张图),然后路由文件 movie.js 通过 res.body.content应该是获取不到提交内容的(见第三张图),这些是我在本地测试的结果,不知道是博主的问题还是我的问题

Conan Zhang

第二图,传参的时候变成了,数组类型。

第三图,取的时候,用req.body.content[‘source’],req.body.content[‘alias’],

严杰

嗯,这个我后来使用了 JSON.stringify 和 JSON.parse 来处理的,我贴的图是博主的代码截图 , 我好奇的是博主运行时代码为何未出问题

Conan Zhang

你可以下载项目源代码试试。

raccoon

可是用content会提示undefined,req.body取值跟你的一样,用JSON.stringify处理后还是无法取到

Steve

照着博主的demo一步一步做,为什么我的数据结构变成这样子了?求解,我的express版本是4

Jack

我也碰到了同样的情况,数据跟你的一样

steven zhan

跟你一样的问题,换成楼下严杰的解决办法就好了

riader

丹哥,我用的是Express4.0,插入数据那里有点问题,第一张图我分别输出参数obj和实例instance,第二张图是obj的输出,有数据,第三张图是instance的输出,instance不知道为啥会这样,并且数据库中也是这样的数据格式,如第四张图

riader

图:

Conan Zhang

可能是express4版本升级后的问题,用 JSON.stringify 和 JSON.parse 转一下吧。

riader

额,提交时要先转化成字符串,post获取后再转换成Object就行了,多谢丹哥

raccoon

谢谢,按照这个成功了

Conan Zhang

🙂

陈挺

,findByName为什么要写DAO里的

我看他们不是这么写么

UserSchema.statics.findByName = function(name,cb){

this.findOne({name:name,cb});

}

这样之后就可以在model里使用这个静态方法了
@Conan Zhang

Conan Zhang

应该是个人习惯的问题,我原来用Java时,在定义数据接口的时候,通常都放到DAO中。

gangr

不错的分享

Ella

直接从github下载代码下来,npm install mongoose和npm install之后,报错如下,求解答。

Conan Zhang

版本的问题,本文是基于express 3的。

90
0
Would love your thoughts, please comment.x
()
x