一起学node.js~
发布于 5 年前 作者 nswbmw 118031 次浏览 最后一次编辑是 1 年前 来自 分享
307 回复

学习了,楼主写的很详细些,手把手新手入门啊~

@snoopy 能不能讲讲mongoose 啊!!

小哥,出来混要打扮下的——css用twitter bootstrap;这样才能吸引妹子啊

这里能有几个妹子啊 = =

很详细,加油!

不错,置顶!

我擦,吃晚饭,刷一下,变样子了~

@snoopy 哈哈,先上线让大家吐槽吐槽。

支持!!!

求mongoose教程

去看我之前翻译的文档,绝大部分查看api就可以使用了

顶一个, 很有奉献精神

必须支持,给我们新手来说帮助太大了,呵呵。

改版后没有什么层次感了!

一阵新鲜感哈

不用mongoose的啊~

@a272121742 看完了,真心不错,谢了。不过因为网站模版改了,教程排版比较乱,看着有点吃力

楼主很给力啊,辛苦了

@snoopy -orz 那您推荐一个吧

就是要多点热爱分享的人,新手表示感谢

那个在安装flash 模块的时候,是在app.js中修改代码,不是在index.js中修改代码吧?

嗯,多谢指正,笔误。。。

感谢楼主奉献 我是Linux下,做到mongodb那里总是报错,说是连接不上数据库 ’throw new Error(‘Error connecting to database’);' 上面的是抛错,mongod是需要额外启动的么?

对,每一次都是先启动 mongod ,后启动 app。

又可以省些时间自己写了哈···

怎么就没得人用MySQL咧

怎么不用pgsql。。 有node.JS jade教程么?

受益了,支持楼主,顶上~~

好文章啊,传说中的深入浅出~~

多谢啊!!!!!

楼主能不能完善下以auth方式启动的mongodb与connect-mongo的连接该如何配置用户名和密码啊。我照着你的系列搞,我的mongodb是以auth方式启动的,所以连接被拒绝,如果能把这完善下就完美了,本人能力有限,捣鼓半天也折腾不出来,期待楼主佳音

楼主,第四章的时候为什么我的评论写不到数据库中,评论的form是提交到post,但是index.js中的post是: app.post(’/post’, checkLogin); app.post(’/post’,function(req,res){ var currentUser = req.session.user, post = new Post(currentUser.name, req.body.title, req.body.post); post.save(function(err){ if(err){ req.flash(‘error’, err); return res.redirect(’/’); } req.flash(‘success’, ‘发布成功!’); res.redirect(’/’); }); }); 并没有有关处理comment的内容啊?请问评论的内容是如果写入到数据库中的?? 期待楼主指教,

咦?你的 comment.js 呢? app.post('/u/:name/:day/:title') 是处理留言的。

不好意思贴错了: app.post(’/u/:name/:day/:title’, function(req,res){ var date = new Date(), time = date.getFullYear() + “-” + (date.getMonth()+1) + “-” + date.getDate() + " " + date.getHours() + “:” + date.getMinutes(), comment = {“name”:req.body.name, “email”:req.body.email, “website”:req.body.website, “time”:time, “content”:req.body.content}; var newComment = new Comment(req.params.name, req.params.day, req.params.title, comment); newComment.save(function(err){ if(err){ req.flash(‘error’,err); return res.redirect(’/’); } req.flash(‘success’, ‘留言成功!’); res.redirect(‘back’); }); });

comment.js是有的,留言的时候也提示留言成功了,也没有报错,

留言成功了,显示不了留言还是怎么?

显示留言成功了,但是我到数据库中查询的结果是:

db.posts.find(); { “name” : “Dn9x”, “time” : { “date” : ISODate(“2013-06-01T07:29:48.298Z”), “yea r” : 2013, “month” : “2013-6”, “day” : “2013-6-1”, “minute” : “2013-6-1 15:29” } , “title” : “this is First”, “post” : “this is my First,\r\nI real happy!”, “com ments” : [ ], “_id” : ObjectId(“51a9a2ec425e47c816000002”) } { “name” : “Dn9x”, “time” : { “date” : ISODate(“2013-06-01T07:30:30.592Z”), “yea r” : 2013, “month” : “2013-6”, “day” : “2013-6-1”, “minute” : “2013-6-1 15:30” } , “title” : “CSS: generated content 1”, “post” : “this is about css and Hmtl???
r\ni like css and html\r\nthis is good”, “comments” : [ ], “_id” : ObjectId(“ 51a9a316425e47c816000003”) }

所以就没有留言显示,但是保存的时候却提示留言成功!

贴出你的 comment.ejs 和 comment.js 我看看

https://github.com/nswbmw/N-blog/wiki/第四章–实现留言功能

楼主,我刚才是直接复制的你这一章的comment.js和comment.ejs的代码,上面的步骤我也是照着来的,

这个是comment.js

var mongodb = require(’./db’);

function Comment(name, day, title, comment) { this.name = name; this.day = day; this.title = title; this.comment = comment; }

module.exports = Comment;

Comment.prototype.save = function(callback) { var name = this.name, day = this.day, title = this.title, comment = this.comment; mongodb.open(function (err, db) { if (err) { return callback(err); } db.collection(‘posts’, function (err, collection) { if (err) { mongodb.close(); return callback(err); } //通过用户名、发表日期及标题查找文档,并把一条留言添加到该文档的 comments 数组里 collection.findAndModify({“name”:name,“time.day”:day,“title”:title} , ‘time’,-1 , {$push:{“comments”:comment}} , {new: true} , function (err,comment) { mongodb.close(); callback(null); });
}); }); };

connect-mongo的说明里写了username和password其实是可选选项,加入到连接代码中即可。 https://npmjs.org/package/connect-mongo 很多事情其实官方的文件都有说的,多看文档可以节约很多时间

@nswbmw 谢谢你了,我直接下载您的源码然后运行,我就直接看你的源码了,其实我主要是想使用MySql,不过也已经可以了,谢谢您了,以后还请多多指教

后来又看了下,发现了点问题 node.js的创建数据库连接传递的参数没有用户名和密码(大部分地方都没写) 我还在查阅资料,看看格式具体是什么

后来重新看了遍文章,连接其实都是由mongodb这个package弄得,connect-mongodb是用来保存回话信息的。。 请在app.js的store: new MongoStore({下增加username和password来保证connect-mongodb的正常使用 mongodb的文档我还在翻阅,希望能找到方法

翻着url连接偶然想起一个方法 在setting.js的host的localhost前面加"用户名:密码@"(不要引号)就可以了 其实和url建立连接的原理相同 app.js的那个username必须是在指定数据库创建的,admin创建的全局用户不行

第四章我出了一个错误是

doc.comments.forEach(function(comment){
  comment.content = markdown.toHTML(comment.content);
});

说这个doc.comments是undefined,找了一天没找到原因,求助

@nswbmw 发了,打扰你了,谢谢~

@Fakefish 你这样写的。。。。去掉title后的逗号 就好了

collection.findOne({
  "name":name,
  "time.day":day,
  "title":title,
}, function(err, doc) {

@nswbmw 还是一样啊,的文章页面还是打不开

@Fakefish comment.js 中把 ‘time’,-1 改成 [[‘time’,-1]]

希望lz也研究一下如何连接开启auth的mongodb 网站在完全安全的情况下也不可能,这也涉及到了数据安全的问题 那个connect-mongo有自带username和password选项,但是主要的mongodb我在文档里找到的关于验证的方法都试了,都没用 我在23楼的方法只是能不报错,mongodb除了comnect-mongo的连接,完全没有其他的连接,修改后涉及数据库查询和提交的flash部分都会显示[object Object]

@nswbmw 第六章修改post那里

collection.find({},{"name":1,time":1,"title":1}).sort({

这里的time前面漏了引号吧

@Fakefish 嗯,已改正。多谢提醒~

请教一下,出现以下问题,大概会是什么情况引起?

6| <% post.tags.forEach(function(tag, index){ %> 7| <% if(tag.tag){ %> 8| <%= tag.tag %> 9| <% } %> Cannot call method ‘forEach’ of undefined

@nswbmw 已经发过去了,麻烦了,谢谢!

第四章中把 ‘time’,-1 改成 [[‘time’,-1]],我用 markdownpad 写 [[‘time’,-1]] 并没有问题,到了 github 上就变成了个 ‘time’,-1 链接了。。。

这教程让人湿了!!! 目测很详细,先感谢楼主啊!!! 待我在linux下部署好环境,再按照教程一步一步来

楼主写的确实不错,不过提个建议。

不知道是楼主是故意这么整的,还是设计思想上有点问题。我觉得代码写的太绕了。纯属个人建议,勿拍。

楼主的那个数据库查找到指定的文章,就是跳到内容页那个取法。我换了一个直接取ID的,我相信也有人试过。可能没有成功。大家可以这么试一下。

//源码 collection.findOne({ “name”: name, “time.day”: day, “title”: title }, function(err, doc) { mongodb.close(); if (err) { callback(err, null) } doc.post = markdown.toHTML(doc.post); callback(null, doc) });

修改后(注意这个不能用id, 要对ID进行一下转换) require(mongodb’).ObjectID(_id) collection.findOne({ "_id": require(mongodb’).ObjectID(_id) }, function(err, doc) { mongodb.close(); if (err) { callback(err, null) } doc.post = markdown.toHTML(doc.post); callback(null, doc) }) });

谢谢。设计思路也许是有点问题。。不过,能看懂就好啦~之前尝试过用 _id 获取文章的。。。说实话,试了几次不成功就干脆改成通过 用户名/日期/标题 来获取了。当然这个是有缺陷的,比如同一天发表两篇及以上相同标题的文章就只能返回最新发表的那篇(虽然这个概率比较小)。通过 _id 就可以避免而且更简单。希望读者自己尝试下就当作业好了,我也就不做修改了。。。

有北京的吗?

这里为什么说forEach undefined?

关于stylesheet设置 原文中用的relative path <link rel="stylesheet" href="stylesheets/style.css">

只要在header.ejs里设置成absolute path <link rel="stylesheet" href="/stylesheets/style.css"> 其他ejs就不用添加stylesheet了

谢~你也许没做到添加 404 页面那,如果做到那你会发现,<link rel="stylesheet" href="/stylesheets/style.css"> 会被 404 劫持,从而无法正常引用 style.css ,我在 stackoverflow 找到答案了。。。要同时把 app.js 中:

app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));

修改成:

app.use(express.static(path.join(__dirname, 'public')));
app.use(app.router);

就可以了。我把 github 上也改过来了。

感谢楼主,这么好的精神真让我受益了,mvc的get ,set是不是如您写的\N-blog\models\user.js里的User.get这种写法差不多呢?已前有学过后后做了前端工作,再也没有接处过了,今天看到你写的这教程让我的JS又进步不少。

如果还需要的话,你可以看下这里,解决的auth的问题 https://github.com/ericfish/Nodejs_Microblog

@ericfish 谢谢,不需要了,我改成了URL形式连接,可以直接带用户名和密码,还可以兼容一些app站

@whitebox 你是如何解决的,我用URL形式还是连接不上啊。求指导

可以把mongodb添加到开机启动脚本

@sxyx2008 所有打开连接的地方都要改。把“mongodb.open(function (err, db) {”换成“MongoClient.connect(【这里是URL】, function(err, db) {”,接下来的错误回调不用改,然后把mongodb.close换成db.close。文件顶部要加上“MongoClient = require(‘mongodb’).MongoClient”
你可以看一下我写的:https://github.com/sanddudu/LightBlog/tree/master/models (那个判断不要抄,我考虑欠妥,会有重复连接的问题)

@sxyx2008 已经push修补之后的代码,解决了重复连接的问题

我按原文编写,编译时,出现如下错误: D:\blog\app.js:29 store: new MongoStore({ ^ ReferenceError: MongoStore is not defined at Object.<anonymous> (D:\blog\app.js:29:14) at Module._compile (module.js:456:26) at Object.Module._extensions…js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) at startup (node.js:119:16) at node.js:901:3

何解

看英文就知道了。。。你没有在顶部加", MongoStore = require(‘connect-mongo’)(express)"吧

非常感谢。太过粗心。把MongoStore 写成了MongoStor了。。

@whitebox 我使用db.authenticate(‘username’,‘password’,options,callback)方法实现了. /**

  • 获取一篇文章

  • @param name

  • @param day

  • @param title

  • @param callback */ Post.getOne = function(name, day, title, callback) { //打开数据库 mongodb.open(function (err, db) { if (err) { return callback(err); }

     db.authenticate('root','root',function(){
         //读取 posts 集合
         db.collection('posts', function(err, collection) {
             if (err) {
                 mongodb.close();
                 return callback(err);
             }
             //根据用户名、发表日期及文章名进行精确查询
             collection.findOne({"name":name,"time.day":day,"title":title},function (err, doc) {
                 mongodb.close();
                 if (err) {
                     callback(err, null);
                 }
                 //解析 markdown 为 html
                 doc.post = markdown.toHTML(doc.post);
                 callback(null, doc);//返回特定查询的文章
             });
         });
     });
    

    }); };

@sxyx2008 使用URL连接可以更好地支持一些在线托管APP的网站,我是这么想的

@whitebox 也是,这个问题困扰了好久,还是上Stack Overflow找到了答案。

##500 TypeError: Object function User(user) { this.name = user.name; this.password = user.password; this.email = user.email; } has no method 'get’已经引入了user.js还报没有get方法,小白撸过

原来get方法写原型上了,呵呵

我注册总是报500 Error: req.flash() requires sessions

原来是app.js没有加入session app.use(express.cookieParser()); app.use(express.session({ secret: settings.cookieSecret, key: settings.db, cookie: {maxAge: 1000 * 60 * 60 * 24 * 30},//30 days store: new MongoStore({ db: settings.db }) }));

赞,暑假拿来看看

我是新手,刚刚照着例子完全做了一遍,有一个小问题: <% post.tags.forEach(function(tag, index){ %> <% if(tag.tag){ %> <a class=“tag” href="/tags/<%= tag.tag %>"><%= tag.tag %></a> <% } %> <% }) %>

这段代码加上后,就会报错,如果去掉就会正常

报错内容: 500 TypeError: d:\blog\views\index.ejs:9 7| 日期:<%= post.time.minute %> | 8| 标签: >> 9| <% post.tags.forEach(function(tag, index){ %> 10| <% if(tag.tag){ %> 11| <a class=“tag” href="/tags/<%= tag.tag %>"><%= tag.tag %></a> 12| <% } %> Cannot call method ‘forEach’ of undefined

清空数据库了吗

问一下楼主

怎么感觉对markdown语法支持有限呢,好多markdown语法用不了,只能用标题、列表、图片和链接,其余的都无效啊…

还有,如果直接写html代码不会被转译,这和markdown兼容html的说法有点不符吧

是我那里弄错了还是那个markdown解析模块是功能不完善?

你写错了吧,模版是不是写成了<%= 内容 %>,应该写成<%- 内容 %>不能写"="

国内关于express框架的实践教程,这个算是最新的了。 早几个月买了本《Node.js开发指南》,里面的node版本太久了,现在很难参照书本例子来写代码,尤其是express。 感谢楼主!

@zkwap 嗯,没写错。。话说要是那个地方写错的话,所有的markdown语法都不能转译成html了…可是我仍有部分能被转译,感觉就像是markdown模块解析功能不全似的

我是新人,在win7安装express的时候就一直安装失败,试过网上很多方法,比如对npm的软件源重新指向。但是依旧是失败; warn package.json rangge-parser@0.0.4 No repository field. warn package.json methods@0.0.2 No repository field. warn package.json methods@0.0.2 No reade data. warn package.json fresh@0.1.0 No repository field. warn package.json cookie-signature@1.0.1 repository field.

warn package.json bytes@0.2.0 No repository field. warn package.json pause@0.0.1 No repository field. warn package.json uid2@0.0.2 No repository field. warn package.json uid2@0.0.2 No readme data. warn package.json github-url-from-git@1.1.1 No repository field. warn package.json assert-plus@0.1.2 No repository field. warn package.json ctype@0.5.2 No repository field.

@nswbmw 感谢,过这么久才来看,已经OK

第五章那个实现分页返回的total为什么没有考虑name?

我当时学习的经验可以借鉴一下http://www.9958.pw/post/nodejs_lesson

这不就是Node.js开发指南中的例子么

优化过的版本,开发指南的是2.5的版本,这个是3.0+的版本,差别还是不小的。

菜鸟重新回顾一下node的知识,先赞一个

新手报到,为什么安装express都会失败呢?

忘记sudo了吧?

会不是是敲命令的时候多敲了-g的问题 -g安装的位置不对 会导致找不到express?

@skoal window环境,偶尔几个包报错连接中断,重试了4次,终于搞定

@nswbmw 刚做到这一章,是碰到了这个问题。按照你的方法解决了。 在第一章时有介绍:http://nodejs.org/api/all.html#all_modules关于模块加载顺序,不过看得不太明白

@yessirpopesama 哦哦 确实是 怪我开始没看仔细

先收下来,有空好好研读一下。

我在做第一章…加油

在header.ejs引入多个js文件时怎么只看到加载一个js呢。而且页面也不正常显示了。不知道是什么原因

找到原因了,是自己删除去了</script>等结束标志

其实node+express ,本人是小白,特别希望哪个大神可以讲讲里面一些基本的东西,特别是exports.reg = function(req, res),这里面两个参数req和res分别是什么对象,里面都有什么东东啊。

在学这个的朋友可以加我,我做到第五章了。2七妖零64579

req是请求,res是返回。Nodejs指南里面应该有,当你发送请求时,比如名字,就会在req.body.name这里获取到。当服务器有东西返回,就用到res。比如req.write。我也是刚学,加油。

@coolicer 感谢感谢,刚才自己网上搜了一下也理解了

请问文章中说把css样式放到head中,我有一个小疑问就是,我如果以外链的形式, 会受到 app.all(’*’, function(req,res){ res.render(“404”); });

影响,所有外链都跳转到404页面了,请问有没有解决办法

github 上不是已经解决了吗 bug-fix-1

@nswbmw 哦哦~谢谢啦~我是之前按照教程学的,最近自己做的时候遇到的困惑~

征集, 开源, 免费, 项目 征集基于百度地图api的开源项目创意。

同志们,作为一个新时代的Android人,我们生活在一个免费而开源的时代:

百度为我们提供了免费的api。 eclipse为我们提供了免费的开发工具。 github为我们提供了免费的代码存储。 网络为我们提供了免费的开发信息。 google为我们带来了开源的android。。 linux为我们提供了免费的开源操作系统。

现在,我们公开征集开源项目创意和开发人员。。 一起完成新的开源项目奇迹。。 寻找超级架构师。。 寻找编程高手。。 寻找具有编程热情的人。。 寻找所有乐于分享的人。。 原帖地址来自:http://bbs.lbsyun.baidu.com/viewthread.php?tid=780&extra=page%3D1

@zkwap 为什么把get方法写到原型上就会报错?

发现个bug,

/home/amaozhao/workspace/blog/node_modules/mongodb/lib/mongodb/db.js:279
          throw err;
                ^
Error: Cannot use a writeConcern without a provided callback
    at Collection.update (/home/amaozhao/workspace/blog/node_modules/mongodb/lib/mongodb/collection.js:501:11)
    at /home/amaozhao/workspace/blog/models/post.js:122:18
    at Db.collection (/home/amaozhao/workspace/blog/node_modules/mongodb/lib/mongodb/db.js:488:44)
    at /home/amaozhao/workspace/blog/models/post.js:101:8
    at /home/amaozhao/workspace/blog/node_modules/mongodb/lib/mongodb/db.js:276:11
    at process._tickCallback (node.js:415:13)

这一行

collection.update({"name":name,"time.day":day,"title":title},{$inc:{"pv":1}});

似乎应该是

collection.update({"name":name,"time.day":day,"title":title},{$inc:{"pv":1}}, function(err, result) {
  if (err) callback(err);
});

不知道我改的对不对~~

新手,学习

请问谁有代码的详细注释啊,有一部分代码看不懂,有的看得懂,但是不知道为什么需要这些代码,不知道实现什么功能

教程写的真不错啊,很详细,赞一个!!!

CSS没有吗? 而且我试了下,还有很多细节可以完善的! 继续加油,共同进步! 如果有空帮忙看看我的问题!http://cnodejs.org/topic/52294b67552118f11a56cf4b

第一章的注册响应部分有点儿问题。

app.post('/reg',function(req, res))

中,注册失败做重定向,应该要返回,如果做2次重定向会出现:

 Error: Can't set headers after they are sent.

应该改成:

return res.redirect('/reg');

谢谢,已修正

第三张增加文件上传功能,有一个小问题。

使用markdown引用图片的时候,原文为

![](images/lufei.jpg)

这么写在访问index目录 / 没问题,但是第四章加上了用户页面浏览和文章浏览时,图片的地址就变成了:

/u/user/2013-9-10/images/lufei.jpg

这样就访问不了图片了。

应该要在image前面加上 /

![](/images/lufei.jpg)

PS:还要赞一下LZ的教程和精益求精的写作态度。谢谢!

谢谢指正~我老混用。。。唉

非常好的教程 发现两个书写上的错误, 第十一章开始,“在 header.ejs 中添加一行样式:”,应该是在stylesheets/style.css中添加 第十四章结束,“最后,在 header.ejs 中添加两行样式:”,应该也是在stylesheets/style.css中添加

谢谢~已修改

@nswbmw 启动app的时候出现的mongodb数据库write warning是什么意思?如果不予理会会有问题吗?谢谢!

你用的 Linux?权限问题?我 Win7没有这个提示啊

@nswbmw 为什么要清空数据库?谢!

@double76 比如上面的错误,添加标签前我们发表的文章存在数据库里的文档是没有 tags 键的,我们添加了标签功能后,用 forEach 方法遍历 tags 数组来显示每条标签,但之前存在于数据库中的文档并没有 tags 键,或者说 tags 键值为 undefined ,所以就不能调用 forEach 方法啦。

@nswbmw 那在实际应用中怎么解决添加新功能这个问题呢?

@double76 因为这是教程,所以每章添加一个功能,每次都要清数据库。在实际应用中一般都是上传最终版本,一般不会有改动。如果真要添加新功能,我认为也只有遍历现在的数据库插入新的键来解决了。。当然先做好备份

/Users/manihome/bbs/node_modules/mongodb/lib/mongodb/db.js:279 throw err; ^ TypeError: undefined is not a function at /Users/manihome/bbs/models/post.js:200:5 at Collection.remove (/Users/manihome/bbs/node_modules/mongodb/lib/mongodb/collection.js:217:12) at /Users/manihome/bbs/models/post.js:191:15 at Db.collection (/Users/manihome/bbs/node_modules/mongodb/lib/mongodb/db.js:488:44) at /Users/manihome/bbs/models/post.js:185:6 at /Users/manihome/bbs/node_modules/mongodb/lib/mongodb/db.js:276:11 at process._tickCallback (node.js:415:13)

想问下这个问题是因为啥?按第五章来得。。

把你的 post.js 和 index.js 发过来我看看

@nswbmw

= post.js (删除部分)

//删除一篇文章 Post.remove = function(name, day, title, post, callback) { //打开数据库 mongodb.open(function (err, db) { if (err) { return callback(err); } //读取posts集合 db.collection(‘posts’, function (err, collection) { if (err) { mongodb.close(); return callback(err); } //根据用户名、日期和标题查找并删除一篇文章 collection.remove({ “name”:name, “time.day”:day, “title”:title }, function (err, result) { mongodb.close(); if (err) { return callback(err); } callback(null); }); }); }); };

= index.js (删除部分)

app.get(’/remove/:name/:day/:title’, checkLogin); app.get(’/remove/:name/:day/:title’, function(req, res) { var currentUser = req.session,user; Post.remove(currentUser.name, req.params.day, req.params.title, function (err) { if (err) { req.flash(‘error’, err); return res.redirect(‘back’); } req.flash(‘success’, ‘删除成功’); res.redirect(’/’); }); });

@manihome 知道了。。我的错。。把 Post.remove = function(name, day, title, post, callback) { 改为 Post.remove = function(name, day, title, callback) {

@nswbmw 搞定了。删除那应该加个最后确认的提示就好了。

第六章实现留言功能那一章,在创建comment.js的时候应该在其头部加入 var mongodb = require(’./db’); markdown = require(‘markdown’).markdown; 不然会报错

谢谢~的确落下了

var mongodb = require('./db');

这一句。不过 markdown = require('markdown').markdown; 不用添加

@nswbmw 第六章我我也遇到一个问题 TypeError: Cannot call method ‘forEach’ of undefined at /Users/manihome/bbs/models/post.js:113:20

@manihome 清空数据库重新试试

@nswbmw

想问下comment.js里面的:

function Comment(name, title, day, comment) { this.name = name; this.title = title; this.day = day; this.comment = comment; }

module.exports = Comment;//这句还有需要加上么?看你新的github上没有。

@manihome module.exports = Comment; 有的啊。需要加

@nswbmw

清空了数据库好了 可以出现评论框 但是评论的数据没有写入到mongodb,前台也就没有评论的内容出来。

程序没有报错,可是就是没有数据。

@manihome 把你的 index.js comment.js post.js 发我邮箱我看看

@nswbmw 已发126邮箱 多谢

@manihome comment.js 中

function Comment(name, title, day, comment) {

改为

function Comment(name, day, title, comment) {

注意看仔细哦。。

@nswbmw

好了,你的文档是不是中间更新过一下?

退出游客浏览文章时出错: 500 TypeError: D:\blog\views\article.ejs:3 1| <%- include header %> 2| <p> >> 3| <% if (user.name == post.name) { %> 4| <span><a class=“edit” href="/edit/<%= post.name %>/<%= post.time.day %>/<%= post.title %>">编辑</a></span> 5| <span><a class=“edit” href="/remove/<%= post.name %>/<%= post.time.day %>/<%= post.title %>">删除</a></span> 6| <% } %> Cannot read property ‘name’ of null

@youarenode 谢谢~这是个才发现的 bug 。。将

  <% if (user.name == post.name) { %>

改为

  <% if (user && (user.name == post.name)) { %>

不错,不错,顶!

http://blog.csdn.net/legend_x/article/details/11595109 网上找到的!还没实验过行不行,要不你先试试,然后告诉我一声! 声明,不是本人博客,我也是初学者!

第10章做PV和用户留言统计。在update数据库中的PV数值时,如果是这样写:

collection.update({"name": name, "time.day": day, "title": title}, {$inc: {"pv": 1}});

我这里运行总会出现:

Error: Cannot use a writeConcern without a provided callback

看来是必须提供一个回调函数,我在mongodb的文档中找了一下,也说必须要提供一个回调函数:

update(selector, document[, options][, callback])

[callback] (function) – must be provided if you performing an update with a writeconcern

我看了一下文档中的例子,有的update代码用到了set方法:

collection.update({a:1}, {$set:{b:2}});

      // Wait for a second then fetch the document
      setTimeout(function() {

        // Fetch the document that we modified
        collection.findOne({a:1}, function(err, item) {
          assert.equal(null, err);
          assert.equal(1, item.a);
          assert.equal(2, item.b);
          db.close();
        });

这应该算是执行了写操作,但是也不没提供回调函数。

最后虽然我加上回调函数弄好了,代码如下:

collection.update({"name" : name, "time.day" : day, "title" : title }, {$inc: {"pv" : 1}}, function(err, res){
     if(err){
      callback(err);
     }
   });

但还是不清楚是否一定要加回调函数。

谢谢,确实应该加,我找到了 [callback] (function) – must be provided if you performing an update with a writeconcern

在练习第三章的时候发现一个问题: target_path最好写绝对路径,我设置了环境变量在c盘,按照楼主的方法文件是upload不了的,改成绝对路径就没有任何问题了,up主可以查看下。

文章索引顺序被打乱,改成“第1章”的形式是不是更好一些呢?大写数字排序有问题。

谢谢~这建议不错。已修改

@nswbmw 呵呵,改成数字后,从10开始排了:)

楼主真是辛苦了,这种奉献精神让人钦佩! session存在connect-mongodb中,如果我做集群,应该没问题吧, 我用pm做了一个,用Nginx来转发,好像感觉没啥问题,session存在db中可以共享的吧,请楼主帮我确认一下,这种模式可以吗,还有没有更好的模式。

以前是做前端的,现在想学服务器端语言,当我在网上看见,nodejs就有一种很想学的感觉这几天一直在教程但是对于我们这种入门的教程实在太少了,今天我才发现这里,太谢谢,楼主了,不知道楼主有QQ群没,可以加入么??谢谢

@zkwap 我正在学习第一章,也是这个问题。请问你怎么改?谢谢。

你好,我正在学习第一章。在注册的时候提示500 TypeError: Object function User(user) { this.name = user.name; this.password = user.password; this.email = user.email; } has no method ‘get’。请问怎么解决。谢谢!

通过 exports.index 导出 index 函数接口,app.get(’/’, routes.index) 相当于:

app.get(’/’, function(req, res){ res.render(‘index’, { title: ‘Express’ }); };) 上面的代码最后一个“;” 写错位置了吧- -!

还有我是个小白… 在index.js中 var crypto = require(‘crypto’), User = require(’…/models/user.js’);

在后面的代码中 var user = new User… 这都懂了 然后怎么就直接使用了 User.get(newUser.name, function (err, user) {} 这里为啥不用实例化

小错误已改。 其实当时参考 microblog 写的此教程,于是就沿用了他的写法,其实这里 save 方法也可以不用 prototype 和 new ,即将代码修改成以下也是可行的:

index.js

app.post('/reg', checkNotLogin);
app.post('/reg', function (req, res) {
  var name = req.body.name,
      password = req.body.password,
      password_re = req.body['password-repeat'];
  //检验用户两次输入的密码是否一致
  if (password_re != password) {
    req.flash('error', '两次输入的密码不一致!'); 
    return res.redirect('/reg');
  }
  //生成密码的 md5 值
  var md5 = crypto.createHash('md5'),
      password = md5.update(req.body.password).digest('hex');
  var newUser = {
      name: req.body.name,
      password: password,
      email: req.body.email
  };
  //检查用户名是否已经存在 
  User.get(req.body.name, function (err, user) {
    if (user) {
      req.flash('error', '用户已存在!');
      return res.redirect('/reg');//用户名存在则返回注册页
    }
    //如果不存在则新增用户
    User.save(req.body.name, password, req.body.email, function (err) {
      if (err) {
        req.flash('error', err);
        return res.redirect('/reg');
      }
      req.session.user = newUser;//用户信息存入 session
      req.flash('success', '注册成功!');
      res.redirect('/');//注册成功后返回主页
    });
  });
});

user.js

var mongodb = require('./db');

function User() {
};

module.exports = User;

//存储用户信息
User.save = function(name, password, email, callback) {
  //要存入数据库的用户文档
  var user = {
      name: name,
      password: password,
      email: email
  };
  //打开数据库
  mongodb.open(function (err, db) {
    if (err) {
      return callback(err);//错误,返回 err 信息
    }
    //读取 users 集合
    db.collection('users', function (err, collection) {
      if (err) {
        mongodb.close();
        return callback(err);//错误,返回 err 信息
      }
      //将用户数据插入 users 集合
      collection.insert(user, {safe: true}, function (err, user) {
        mongodb.close();//关闭数据库
        callback(null);//成功!err 为 null
      });
    });
  });
};

但建议你还是去了解一下 prototype 和 new 的用法。

有没有哪位高手在BAE上面成功的部署运行这个例程? 我的出现以下错误: An error has occurred: {“code”:“ECONNRESET”} 查看了一下后台的错误日志如下: DEBUG:2013-09-23 17:06:44fishblog.duapp.com –Express server listening on port 0 open FATAL:2013-09-23 17:06:44fishblog.duapp.com

instance0/nodejs/fishblog.duapp.com/app/node_modules/mongodb/lib/mongodb/connection/server.js:562 throw err; ^ FATAL:2013-09-23 17:06:44fishblog.duapp.com –TypeError: Cannot call method ‘slice’ of undefined at convert_tree_to_html (instance0/nodejs/fishblog.duapp.com/app/node_modules/markdown/lib/markdown.js:1448:21) at Object.toHTMLTree (instance0/nodejs/fishblog.duapp.com/app/node_modules/markdown/lib/markdown.js:110:14) at Object.toHTML (instance0/nodejs/fishblog.duapp.com/app/node_modules/markdown/lib/markdown.js:80:22) at Post.getTen (instance0/nodejs/fishblog.duapp.com/app/models/post.js:85:33) at Array.forEach (native) at Post.getTen (instance0/nodejs/fishblog.duapp.com/app/models/post.js:84:16) at Cursor.toArray (instance0/nodejs/fishblog.duapp.com/app/node_modules/mongodb/lib/mongodb/cursor.js:158:16) at Cursor.nextObject.commandHandler (instance0/nodejs/fishblog.duapp.com/app/node_modules/mongodb/lib/mongodb/cursor.js:643:16) at Db._executeQueryCommand (instance0/nodejs/fishblog.duapp.com/app/node_modules/mongodb/lib/mongodb/db.js:1641:20) at g (events.js:192:14)

为什么我照着你的代码写的,只要上传图片,服务器会自动关闭,最终传不图片

我偶尔会遇到这种情况,你试试发表篇文章评论什么的,然后再上传,应该就可以了。还没搞明白哪里出问题了。

@nswbmw还是不行,一点上传,服务器就会关闭。

@xinchen37 把你代码打包发过来我看看

@nswbmw给你发过来了,先谢谢你了。

楼主,我刚看完第一章,请问一下你的email格式检测是在哪段代码里?不输email是可以注册,输入错误格式的email就会有提示

我找不到那段代码!!谢谢!!

根本没有检测 email 格式的代码。。靠浏览器检测的…

@nswbmw恩,可以了,我重新更新了一下npm 现在可能了谢谢。现nodejs这方面的教程很少,楼主能用空闲的时间来制作教程,热心帮助大家,表示很敬配。

@nswbmw 搞明白了,是HTML5的form表单新功能,高级!谢谢!

password=md5.update(req.body.password).digest(‘hex’);

这句一直出500错误…重启数据库和node两次都不行,加了一句console.log(req.body.password)再重启居然好了…

刚开始研究Nodejs+express,看了这个例子文档非常好! 有一个小问题,例子中Mongodb是本地的,如果我要连接的MongoDB是在远程,需要用户名、密码,那么如何初始化db呢?

是不是要修改db.js文件?如何修改?

var settings = require(’…/settings’); var Db = require(‘mongodb’).Db; var Connection = require(‘mongodb’).Connection; var Server = require(‘mongodb’).Server;

module.exports = new Db(settings.db,new Server(settings.host,Connection.DEFAULT_PORT,{}),{safe : true});

node如何对用户的输入进行有效性进行验证?

浏览器端和服务器端都可以验证啊,我这里没写验证而已

昨天就在看发现有个问题,lz改正一下:

app.use(express.session({ secret: settings.cookieSecret, key: settings.db, cookie: {maxAge: 1000 * 60 * 60 * 24 * 30},//30 days store: new MongoStore({ db: settings.db, host: settings.host //加入这行 }) }));

终于照着你的文章一步步搭建好了,对express和mongodb大概有了个皮毛的印象,还得学习很多啊

谢谢楼主,就是看着你的教程学习的!有没有人像我一样测试的时候真的在里面写自己的博客文章,结果到后面舍不得清空数据库了……

囧…

@nswbmw大神您好,在学您的教程的第一节,我想给post集合增加一个user_id字段,用来存user的_id,我是这样改的,post.js这个文件中,改 function Post(name, name_id, title, post) { this.name = name; this.name_id = name_id; // 增加了name_id this.title= title; this.post = post; }

var post = {
    name: this.name,
    name_id: this.name_id,   //增加的name_id
    time: time,
    title: this.title,
    post: this.post
};

然后在路由index.js中改 app.post(’/post’, function (req, res) { var currentUser = req.session.user, //增加了currentUser._id post = new Post(currentUser.name, currentUser._id, req.body.title, req.body.post); post.save(function (err) { if (err) { req.flash(‘error’, err); return res.redirect(’/’); } req.flash(‘success’, ‘发布成功!’); res.redirect(’/’); }); }); 然后index.ejs模板中改一行,这里a标签故意没有<>,防止发帖时候被转化 作者:a href="/u/<%= post.name %>"><%= post.name %> 改为下面, 作者:a href="/u/<%= post.name_id %>"><%= post.name %> 但是发表文章之后,html中这里的链接却是 作者:a href="/u/null" 没有报错信息,不能理解哪里出错了,求救大神,期待大神的解答,谢谢

@nswbmw您好,仔细看了您写的,您说可以直接使用 post._id 从数据库中获取 _id 的值(字符串),我也是这样的啊,定义了这个变量var currentUser = req.session.user,后,currentUser._id不就是user的_id吗,这错在哪里呢,请大神指点

@MyGod 我知道了。

app.post('/reg') 注册成功时,我们

var newUser = new User({
    name: req.body.name,
    password: password,
    email: req.body.email
});

req.session.user = newUser;//用户信息存入 session

所以在 app.post('/post') 里的

var currentUser = req.session.user

currentUser 就不存在 _id 键。

解决方法就很简单了,自己想吧~

@nswbmw您好,很感谢您的回复,可惜我是新人,没有经验,所以还不是很明白, var newUser = new User({ name: req.body.name, password: password, email: req.body.email });newUser的时候还不存在_id,这我知道,但是newUser之后,数据库自己不就生成这个字段了吗, 是不是把_id放到var newUser = new User({里面,但是这个是数据库生成的啊,不知道如何解决,再次请教大神

@MyGod newUser 不存在 _id ,存到数据库后自动添加了 _id 键,但我们是把 newUser 存入 session 的啊,不是从数据库取出来的然后存入 session 的,明白了吧?一个解决方法:

User.prototype.save 里最后的 callback(null); 改为 callback(null, user[0]);

将 index.js 中 app.post('/reg') 部分修改为

  newUser.save(function (err, user) {
    if (err) {
      req.flash('error', err);
      return res.redirect('/reg');
    }
    req.session.user = user;//用户信息存入 session
    req.flash('success', '注册成功!');
    res.redirect('/');//注册成功后返回主页
  });

这样比原先写法也好。。我回头把教程改改

@nswbmw明白,这个问题只在刚注册时候存在,第二次登陆就不存在了,对于我这样的小白,大神能一次次耐心回复,真的非常感谢,大神的黑客分享精神让人钦佩,期待您新的教程, 这里的callback(null, user[0]);如果user[0]写成user可以吗,为什么要写成user[0]呢,

@MyGod 你在命令行中 console.log(user) 就会发现返回的是一个数组,数组中就一项,为刚注册后的用户信息的对象。可以写成 user 啊,只不过 index.js 中就要用 user[0] 了。

@nswbmw您好,这样改后,req.session.user = newUser;这句不做修改吗,依然还是为null,不知道是什么原因,再次请大神指点,真的很抱歉啊

@MyGod 上面不是改了吗?req.session.user = user;

@nswbmw抱歉啊,自己粗心了,只注意这里呢function (err, user) {,谢谢大神的热情耐心的解答

@nswbmw前辈您好,您的教程里面,user.js的save函数是这样写的 User.prototype.save = function(callback) { //要存入数据库的用户文档 var user = { name: this.name, password: this.password, email: this.email }; post.js里的save函数里面也是这样 //要存入数据库的文档 var post = { name: this.name, time: time, title: this.title, post: this.post }; 但是在comment.js函数里面 //存储一条留言信息 Comment.prototype.save = function(callback) { var name = this.name, day = this.day, title = this.title, comment = this.comment; 却是这样写,这两张写法有什么区别,请前辈指点

请问这个教程有注册的验证码功能吗?

暂时没有

学习,准备靠这个系统的学习一下node

这个还是要非常感谢一下楼主的分享精神…

初学者福音…我就是跟这个学的…

再次感谢

Express server listening on port 3000 GET / 200 32ms - 473b GET /stylesheets/style.css 304 26ms GET /login 200 0ms - 657b GET /stylesheets/style.css 304 0ms GET /reg 200 0ms - 791b GET /stylesheets/style.css 304 15ms

C:\blog\node_modules\mongodb\lib\mongodb\db.js:279 throw err; ^ ReferenceError: collection is not defined at C:\blog\models\user.js:23:9 at C:\blog\node_modules\mongodb\lib\mongodb\db.js:276:11 at process._tickCallback (node.js:415:13)

C:\blog>

注册新用户时 报错, 这个是怎么回事呢?

找到了 拉了一句,不好意思!

做到发表文章的时候报错,请问是什么问题? user is not defined at buf.push… <form method=“post”> 标题:<br /> <input type=“text” name=“title” /><br /> 正文:<br /> <textarea name=“post” rows=“20” cols=“100”></textarea><br /> <input type=“submit” value=“发表” /> </form> .buf (eval at <anonymous> (D:\blog\node_modules\ejs\lib\ejs.js:236:14), <anonymo us>:30:321) at eval (eval at <anonymous> (D:\blog\node_modules\ejs\lib\ejs.js:236:14), < anonymous>:31:23) at eval (eval at <anonymous> (D:\blog\node_modules\ejs\lib\ejs.js:236:14), < anonymous>:33:35) at D:\blog\node_modules\ejs\lib\ejs.js:249:15 at Object.exports.render (D:\blog\node_modules\ejs\lib\ejs.js:287:13) at View.exports.renderFile [as engine] (D:\blog\node_modules\ejs\lib\ejs.js: 317:20) at View.render (D:\blog\node_modules\express\lib\view.js:76:8) at Function.app.render (D:\blog\node_modules\express\lib\application.js:506:

at ServerResponse.res.render (D:\blog\node_modules\express\lib\response.js:8 03:7) at D:\blog\routes\index.js:109:8

代码打包给我看看

@nswbmw代码已经打包发送到你的邮箱了,麻烦检查一下。

@nswbmw楼主您好,看到您在GitHub上的文章番外篇之——使用 _id 查询,自己试着改写了您教程的第一篇的代码,可以通过/p/19e01c563e9f8a542fa68001这样的url来访问文章,运行成功,但是如果/p/后面的数字是一个没有非法的文章id,只要随便改动后面文章id的任何一个数字,然后url提交,会造成整个node的崩溃,不知道这情况怎么解决,请教楼主

@livejs 你把改后的代码打包发给我吧,我就省下自己改了,我看看怎么解决

@nswbmw楼主好,代码已经发给您了

写得很详细,终于把我这新手带入门啦! 非常感谢!

教程写得很详细,详细看完前面三章,后面扫一下就行了。

有一点不好,就是cnodejs里没有使用日志文件,从架构上小站无疑!

@nswbmw 楼主,请问先定义了这个函数 function checkLogin(req, res, next) { if (!req.session.user) { req.flash(‘error’, ‘未登录!’); res.redirect(’/login’); } next(); }

然后下面这么使用我有点看不懂阿 app.get(’/logout’, checkLogin); app.get(’/logout’, function (req, res) { req.session.user = null; req.flash(‘success’, ‘登出成功!’); res.redirect(’/’);//登出后跳转到主页 });

请问这个是javascript的语法糖还是node的语法糖阿,能不能解释一下或者推荐几个链接可以学习一下这种函数使用方式

我注册报500 Error: req.flash() requires sessions 是什么原因哦?

@nswbmw楼主您好,我安装了robomongo for windows,打开它的时候提示robomongo.exe不是有效的Win32应用程序,试了几个版本都是一样,请问怎么解决呢?

怎么也不整个pdf下载啊,

不能显示?404?怎么清空数据库?

请问下为什么每次open mongodb connection之后又close呢,有更好的方式么。

很详细,整理个 pdf 或者 kindle 格式吧。

@justjavac 首页输出多个栏目内容怎么写?就是首页显示文章列表,也显示用户列表。

什么意思?

@justjavac 我想在首页显示用户列表和文章列表两个分类。

我也发现这个写法的问题了 open cannot be called multiple times 这个错误避不开,不知道有什么好的解决方案

楼主,给你个建议哈,那些启动脚本我觉得可以直接写成node脚本,例如startDb.js,因为本人用webStorm开发,所以可以直接右击运行,你懂的而且既然都已经是用nodejs了么,就干脆都用nodejs搞定呗哈哈

有理~

请问下,在做博客系统的时候,出现-E11000 duplicats key error index: microblog.posts.$user_1 dup key: { : null}这个报错是咋回事儿呢

楼主,能帮看一下这个问题是什么原因吗?
能够参考什么资料解决?
http://cnodejs.org/topic/5292c061a6957a08094eb7c9

多谢楼主分享,

照着手顺做了一个http://hawkstep.herokuapp.com/

还有些问题完善中。

回来捡nodejs LZ的教程非常受用

楼主您好,我想问一下 如果填写表单出错后,直接在当页出现提示,并且保持填写不要消失,如何弄呢?

楼主威武,一下子让我进步很多!

楼主,为什么我一运行node app,就一直出来一行一行的显示node app,都不执行了,反正只要在blog文件夹下面运行nodejs指令,不管运行哪个文件,都是一大串node app出现啊

这个问题我自己解决了,是因为我有个文件名字叫node.bat,本来是用来执行node app的

楼主一起学习nodejs项目文件的标题,title的这只猫你是怎么放进项目的,没有看到style中有<link rel=“shortcut icon” href=“xxxx” type=“image/x-icon” /> 啊

app.use(express.favicon(__dirname + '/public/images/favicon.ico'));

@nswbmw哦哦,原来是这样啊

@mnpqxz楼主我用的是sublime text2运行一个nodejs文件,打开了一个80端口,但是我怎么将这个80端口关闭啊

楼主: 在第一章的注册那个章节中,修改 index.js 中 app.post(’/reg’) 如下: newUser.save(function (err, user) { if (err) { req.flash(‘error’, err); return res.redirect(’/reg’);//注册失败返回主册页 } req.session.user = user;//用户信息存入 session req.flash(‘success’, ‘注册成功!’); res.redirect(’/’);//注册成功后返回主页 });

req.session.user = user;//用户信息存入 session, 这句在运行时候user=undefined,我看github源码是 req.session.user = newuser;那这里的function里面加入user参数是啥意思呢?

用app.use(express.router(routes)) 代替 app.use(app.router)。 运行出现没有router 方法

楼主我在增加文章转载的时候,要是删除的是原文章,对应转载它的还是会出现,不是应该将其删除的么?

请教下楼主: 我在看 番外篇之——部署到 Heroku

用107.21.95.3 的时候,一直报错permission denied (publickey)

也被墙了吗~

谢谢啦~收藏了慢慢看

想把这个项目部署到bae上,遇到很多问题,fs不可用,还有貌似flash也不支持等等。。

新人,顶一下。

这个教程写得太专业了,两天时间把整个教程做了一遍。算是入门了:) “知其然、知其所以然”。后面再研究一下具体的实现方法了

在演习到注册用户的时候: 运行node会报错:

Error: EISDIR, read

如果进行注册,则会出现如下:

Cannot GET /post?name=test&password=123&password-repeat=123&email=222%40qq.com

我有查找原因,说是 操作的只是一个目录而不是 文件。

有没有碰到的?

最好 THX。

<h2 style=“color:#f00;”>作为nodejs新人的提问</h2> <br> 在学习过程中遇到好多问题

<br> 比如在学习到第15章时遇到了这样一个问题

<br> 在index.ejs页有错误提示

<br> “Cannot read property ‘reprint_from’ of undefined”

<br> 刚开始以为是post.js里面缺少这个属性

<br> 后来发现代码没有问题

<br> 把db重新删除后重启就好了

<br> 不过还是很多问题没有想明白

<br>

  1. 到底模版(ejs)、路由(index.js)和功能模块(post.js,user.js…)之间是怎么的关系?为什么数据库里的数据会影响页面的某个属性?

<br>

  1. 这三者在运行时的生成顺序是怎样的?路由-功能模块-模版?

啊啊啊啊啊啊啊啊啊啊啊啊啊啊

前辈你好, 请问你的N-blog在heroku部署时 http://cuitianze.herokuapp.com/ 为什么会出现如下的问题呢

Application Error

An error occurred in the application and your page could not be served. Please try again in a few moments.

If you are the application owner, check your logs for details.

另外,应该不是部署的问题,因为你的另一个开源作品N-chat能够部署成功 http://tianze.herokuapp.com/

Error: Error setting TTL index on collection : sessions

mongod --auth 方式启动

//setting.js

module.exports = { 
  cookieSecret: 'myblog', 
  db: 'nodejs', 
  host: 'admin:admin@localhost'
  //别的地方和教程一样
};

如果不 auth 启动 的话, setting.js, host: 'localhost'是正常的

能不能有个提高版,不要一直围绕Express来讲述nodejs…

能写出像这样好并且图文并茂的优秀教程,佩服楼主!我这两天刚刚将第一章完成(自己加入了Bootstrap).明天还要温习啊!我自己还要不断认真的学习啊!:)

佩服楼主,我刚入前端开发。 UI还可以加入bootstrap.

楼主 为何我 页面之间点击跳转没问题 但是跳转后回原来的页面一刷新 页面就全白了 而且奇怪的是只有在safari中出现

楼主真的给力,赞,学习ing

学完第一章了,特来顶!

楼主请问番外篇之——使用 generic pool 之后,页面刷新第一次是错误页面,第二次才能显示,然后又是刷新错误,刷新正常,怎么解决?

楼主能否讲解一下后台系统权限这部分,包括数据库的设计? http://cnodejs.org/topic/536f3a2721469f860f01401d

@nswbmw 赶脚楼上是妹纸:)

咦,, 内容怎么和我买的《node.js实战》内容几乎一样,莫不是同一个人写的?

正在模仿lz的学习 但是现在版本是4.8 还是有很多不一样

能用koa重构吗?

您好,为什么我每次重启都必须要清空数据库呢?

@hdy007007 是因为在加入新功能后,比如评论comments 里面没有数据,在前端遍历的时候就会报错。

@qianjiahao 您好,我的意思是每次,就是说自从连上了数据库后,每次重启node.js都要先清空数据库,我也不知道什么原因

@qianjiahao 好吧,貌似是mongodb版本问题,已解决,谢谢!

番外篇中的generic-pool出现如下问题:

D:\nodejs\blog\models\post.js:15 mongodb.close(); ^ TypeError: Cannot call method ‘close’ of undefined at Object.poolModule.Pool.destroy (D:\nodejs\blog\models\post.js:15:13) at Object.me.destroy (D:\nodejs\node_modules\generic-pool\lib\generic-pool.js:152:13) at removeIdle (D:\nodejs\node_modules\generic-pool\lib\generic-pool.js:181:10) at Timer.listOnTimeout [as ontimeout] (timers.js:112:15) ----------------------------------------------------------------------------------------- 代码块: ``` destroy : function(mongodb) { mongodb.close(); },

已经找到原因了,是我看漏了

非常好的教程,感谢分享!

原来大神你在这里,我当时就是看着你的教程开始学习node的(星星眼) 谢谢~好想关注你啊,怎么关注你啊

谢谢楼主,貌似很火,先顶后看。

做完番外篇之——使用 _id 查询后,试着发表一篇文章,启动npm start报这个错

2016-01-12 11-04-26屏幕截图.png 2016-01-12 11-05-13屏幕截图.png

这是CNode最火的一个帖子,因为它为广大初学者提供了一个很好的教程,只有耐心为广大初学者写的教程才能受到最多的人欢迎!

前辈你好,请问有没有链接MySQL的教程

简单,明了,直接,利器!

大侠求助,自己调试时遇到一个问题: QQ图片20160314221552.png 下载github上的代码也是报同样的错误,可否指点一二。

ReferenceError: /Users/jachin/Project/Node/Node-Blog/views/article.ejs:2 1| <%- include header %>

2| <p> 3| <% if(user && (user.name == post.name)) { %> 4| <span> 5| <a class=“edit” href="/edit/<%= post.name %>/<%= post.time.day %>/<%= post.title %>">编辑</a>

posts is not defined

请问一下这个怎么回事啊,打印返回的值都有,但是跳转到这边的时候就报这个错误

@nswbmw 我就是妹子啊! 楼主好棒啊!

很详细 特意注册帐号来感谢!!

req.fields.name 请问这个是什么意思呢???

向楼主学习!已star😄

浏览数已突破列表页的一行 untitled1.png

很赞,一口气看到了底部,对于NodeJs一些基础理解很好。

学了一段时间了

回到顶部