最近又把教程重写了一遍,添加了几个功能:
- 上传文件
- 编辑和删除文章
- 转载功能和转载统计
- 日志功能
github :https://github.com/nswbmw/N-blog
前面的教程现已废弃。
若在学习过程之中遇到错误,给所有读者以下建议:
1.自己通过错误信息分析哪里出错
2.对比 github 上的源码找出错误
3.清空数据库,重新运行 app.js (这点很重要)
4.把错误的代码打包发到 gxqzk@126.com ,我帮你解决问题
感谢楼主奉献 我是Linux下,做到mongodb那里总是报错,说是连接不上数据库 ‘throw new Error(‘Error connecting to database’);’ 上面的是抛错,mongod是需要额外启动的么?
楼主能不能完善下以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的内容啊?请问评论的内容是如果写入到数据库中的?? 期待楼主指教,
不好意思贴错了: 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”) }
所以就没有留言显示,但是保存的时候却提示留言成功!
https://github.com/nswbmw/N-blog/wiki/%E7%AC%AC%E5%9B%9B%E7%AB%A0–%E5%AE%9E%E7%8E%B0%E7%95%99%E8%A8%80%E5%8A%9F%E8%83%BD
楼主,我刚才是直接复制的你这一章的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 很多事情其实官方的文件都有说的,多看文档可以节约很多时间
后来重新看了遍文章,连接其实都是由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,找了一天没找到原因,求助
@Fakefish 你这样写的。。。。去掉title后的逗号 就好了
collection.findOne({
"name":name,
"time.day":day,
"title":title,
}, function(err, doc) {希望lz也研究一下如何连接开启auth的mongodb 网站在完全安全的情况下也不可能,这也涉及到了数据安全的问题 那个connect-mongo有自带username和password选项,但是主要的mongodb我在文档里找到的关于验证的方法都试了,都没用 我在23楼的方法只是能不报错,mongodb除了comnect-mongo的连接,完全没有其他的连接,修改后涉及数据库查询和提交的flash部分都会显示[object Object]
请教一下,出现以下问题,大概会是什么情况引起?
6| <% post.tags.forEach(function(tag, index){ %> 7| <% if(tag.tag){ %> 8| <%= tag.tag %> 9| <% } %> Cannot call method ‘forEach’ of undefined
若在学习过程之中遇到错误,给所有读者以下建议:
1.自己通过错误信息分析哪里出错 2.对比 github 上的源码找出错误 3.清空数据库,重新运行 app.js 4.把代码打包发到 gxqzk@126.com ,我帮你解决问题
第四章中把 'time’,-1 改成 [['time’,-1]],我用 markdownpad 写 [['time’,-1]] 并没有问题,到了 github 上就变成了个 'time’,-1 链接了。。。
楼主写的确实不错,不过提个建议。
不知道是楼主是故意这么整的,还是设计思想上有点问题。我觉得代码写的太绕了。纯属个人建议,勿拍。
楼主的那个数据库查找到指定的文章,就是跳到内容页那个取法。我换了一个直接取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 就可以避免而且更简单。希望读者自己尝试下就当作业好了,我也就不做修改了。。。
关于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又进步不少。
@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 (那个判断不要抄,我考虑欠妥,会有重复连接的问题)
我按原文编写,编译时,出现如下错误: 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
何解@whitebox 我使用db.authenticate('username’,’password’,options,callback)方法实现了. /**
-
获取一篇文章
-
[[[@param](/user/param)](/user/param)](/user/param) name
-
[[[@param](/user/param)](/user/param)](/user/param) day
-
[[[@param](/user/param)](/user/param)](/user/param) title
-
[[[@param](/user/param)](/user/param)](/user/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);//返回特定查询的文章 }); }); });}); };
##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方法,小白撸过
原来是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){ %> <%= tag.tag %> <% } %> <% }) %>
这段代码加上后,就会报错,如果去掉就会正常
报错内容: 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| <%= tag.tag %> 12| <% } %> Cannot call method ‘forEach’ of undefined
问一下楼主
怎么感觉对markdown语法支持有限呢,好多markdown语法用不了,只能用标题、列表、图片和链接,其余的都无效啊…
还有,如果直接写html代码不会被转译,这和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 刚做到这一章,是碰到了这个问题。按照你的方法解决了。 在第一章时有介绍:http://nodejs.org/api/all.html#all_modules关于模块加载顺序,不过看得不太明白
其实node+express ,本人是小白,特别希望哪个大神可以讲讲里面一些基本的东西,特别是exports.reg = function(req, res),这里面两个参数req和res分别是什么对象,里面都有什么东东啊。
req是请求,res是返回。Nodejs指南里面应该有,当你发送请求时,比如名字,就会在req.body.name这里获取到。当服务器有东西返回,就用到res。比如req.write。我也是刚学,加油。
请问文章中说把css样式放到head中,我有一个小疑问就是,我如果以外链的形式, 会受到 app.all('*’, function(req,res){ res.render(“404”); });
影响,所有外链都跳转到404页面了,请问有没有解决办法
征集, 开源, 免费, 项目 征集基于百度地图api的开源项目创意。
同志们,作为一个新时代的Android人,我们生活在一个免费而开源的时代:
百度为我们提供了免费的api。 eclipse为我们提供了免费的开发工具。 github为我们提供了免费的代码存储。 网络为我们提供了免费的开发信息。 google为我们带来了开源的android。。 linux为我们提供了免费的开源操作系统。
现在,我们公开征集开源项目创意和开发人员。。 一起完成新的开源项目奇迹。。 寻找超级架构师。。 寻找编程高手。。 寻找具有编程热情的人。。 寻找所有乐于分享的人。。 原帖地址来自:http://bbs.lbsyun.baidu.com/viewthread.php?tid=780&extra=page%3D1
发现个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引用图片的时候,原文为

这么写在访问index目录 / 没问题,但是第四章加上了用户页面浏览和文章浏览时,图片的地址就变成了:
/u/user/2013-9-10/images/lufei.jpg
这样就访问不了图片了。
应该要在image前面加上 /

PS:还要赞一下LZ的教程和精益求精的写作态度。谢谢!
非常好的教程 发现两个书写上的错误, 第十一章开始,“在 header.ejs 中添加一行样式:”,应该是在stylesheets/style.css中添加 第十四章结束,“最后,在 header.ejs 中添加两行样式:”,应该也是在stylesheets/style.css中添加
@double76 比如上面的错误,添加标签前我们发表的文章存在数据库里的文档是没有 tags 键的,我们添加了标签功能后,用 forEach 方法遍历 tags 数组来显示每条标签,但之前存在于数据库中的文档并没有 tags 键,或者说 tags 键值为 undefined ,所以就不能调用 forEach 方法啦。
@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 (删除部分)
//删除一篇文章 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) {
第六章实现留言功能那一章,在创建comment.js的时候应该在其头部加入 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
想问下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 comment.js 中
function Comment(name, title, day, comment) {
改为
function Comment(name, day, title, comment) {
注意看仔细哦。。
@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
楼主真是辛苦了,这种奉献精神让人钦佩! session存在connect-mongodb中,如果我做集群,应该没问题吧, 我用pm做了一个,用Nginx来转发,好像感觉没啥问题,session存在db中可以共享的吧,请楼主帮我确认一下,这种模式可以吗,还有没有更好的模式。
以前是做前端的,现在想学服务器端语言,当我在网上看见,nodejs就有一种很想学的感觉这几天一直在教程但是对于我们这种入门的教程实在太少了,今天我才发现这里,太谢谢,楼主了,不知道楼主有QQ群没,可以加入么??谢谢
你好,我正在学习第一章。在注册的时候提示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)
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});
昨天就在看发现有个问题,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 //加入这行 }) }));
@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前辈您好,您的教程里面,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; 却是这样写,这两张写法有什么区别,请前辈指点
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"> 标题:<input type="text" name="title" />
正文:
<textarea name="post" rows="20" cols="100"></textarea>
<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: 10) at ServerResponse.res.render (D:\blog\node_modules\express\lib\response.js:8 03:7) at D:\blog\routes\index.js:109:8
@nswbmw楼主您好,看到您在GitHub上的文章番外篇之——使用 _id 查询,自己试着改写了您教程的第一篇的代码,可以通过/p/19e01c563e9f8a542fa68001这样的url来访问文章,运行成功,但是如果/p/后面的数字是一个没有非法的文章id,只要随便改动后面文章id的任何一个数字,然后url提交,会造成整个node的崩溃,不知道这情况怎么解决,请教楼主
@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的语法糖阿,能不能解释一下或者推荐几个链接可以学习一下这种函数使用方式
楼主,给你个建议哈,那些启动脚本我觉得可以直接写成node脚本,例如startDb.js,因为本人用webStorm开发,所以可以直接右击运行,你懂的而且既然都已经是用nodejs了么,就干脆都用nodejs搞定呗哈哈
请问下,在做博客系统的时候,出现-E11000 duplicats key error index: microblog.posts.$user_1 dup key: { : null}这个报错是咋回事儿呢
楼主一起学习nodejs项目文件的标题,title的这只猫你是怎么放进项目的,没有看到style中有<link rel="shortcut icon" href="xxxx" type="image/x-icon" /> 啊
楼主: 在第一章的注册那个章节中,修改 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参数是啥意思呢?
在演习到注册用户的时候: 运行node会报错:
Error: EISDIR, read
如果进行注册,则会出现如下:
Cannot GET /post?name=test&password=123&password-repeat=123&email=222%40qq.com
我有查找原因,说是 操作的只是一个目录而不是 文件。
有没有碰到的?
最好 THX。
作为nodejs新人的提问
在学习过程中遇到好多问题
比如在学习到第15章时遇到了这样一个问题
在index.ejs页有错误提示
“Cannot read property ‘reprint_from’ of undefined”
刚开始以为是post.js里面缺少这个属性
后来发现代码没有问题
把db重新删除后重启就好了
不过还是很多问题没有想明白
- 到底模版(ejs)、路由(index.js)和功能模块(post.js,user.js…)之间是怎么的关系?为什么数据库里的数据会影响页面的某个属性?
- 这三者在运行时的生成顺序是怎样的?路由-功能模块-模版?
前辈你好, 请问你的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/