郑重声明,本文章属于我的原创,如需转载,请加上原文连接:
http://segmentfault.com/blog/yuanzm/1190000002620309
另外一样能够在博客园上面查看本文章:http://www.cnblogs.com/yuanzm/p/3770986.html
源代码在本人的Github上面:https://github.com/yuanzm/microblogjavascript
以前一直执着于前端开发,最近几天,开始学起了nodejs。做为一名前端开发者,见到这样一门用javascript写的后台天然是很激动的。可是,后台毕竟不一样于前端,在学习的过程当中,仍是会遇到很多问题。css
为了开始学习nodejs,一开始选择了《深刻浅出nodejs》这本书,看了几章以后,得出一个结论是:真是一本好书,可是仍是不会写nodejs!而后选择了另一本教材《nodejs开发指南》,因为看过了《深刻浅出nodejs》,直接跳过了这本书的前几章,写起了该书第五章的微博实例。做为一个新手,在写的过程当中,才逐渐发现由于express版本升级的缘由,书中的代码不少已经不能用了,这对于新手来说,真是痛苦的经历!!本着分享和学习的精神,特此奉上《nodejs开发指南》微博实例express4.x版本源码和编写过程当中须要注意的问题。html
首先咱们看看当前express的版本:前端
这和书本所用的express2.x版本已经有了很大的变化。对于express4版本的新特性,能够看看这个:http://scotch.io/bar-talk/expressjs-4-0-new-features-and-upgrading-from-3-0java
话很少说,咱们开始咱们建立项目之旅。node
首先咱们新建一个文件夹,用cmd进入文件夹,准备建立项目。按照书中提到的,建立项目的命令应该是:git
express -t ejs microblog
问题是express -t参数已经失效,最新的express版本的默认模板引擎是jade,因此为了使用ejs,咱们须要像下面这样建立项目:github
express -e ejs microblog
按照书中所说的,咱们直接运行代码:mongodb
supervisor app.js
而且在浏览器中输入http://localhost:3000/,并不能看到书中须要的效果,而是须要在app.js中app.use('/', routes);后面添加:数据库
app.listen(3000); Console.log(something happening);
按照书中的步骤往下走,咱们会发现一个问题,由于在views文件夹里面不是layout.ejs和index.ejs,这是由于,最新版本的express不支持ejs模块的partials方法,因此须要本身额外安装模块:
npm install express-partials
而后在app.js中添加:
var partials = require('express-partials'); app.use(partials());
须要注意的是,这一行要添加到app.set('view engine', 'ejs');后面,若是添加到app.use('/', routes);后面,会出现css引用失败的现象,博主还不明白缘由。
这时候就能够在views中新建文件layout.ejs,而后复制书中112页的layout.ejs代码到咱们新建的文件上面。而后运行代码,就能看到下面的效果了:
以上的步骤都不算什么问题,问题就出在链接数据库的一系列问题!以下所述:
为了执行下面的操做,咱们首先须要安装MongoDB数据库,博主推荐这篇博客:http://be-evil.org/install-mongodb-on-windows7.html
看了很多安装MongoDB的博客,这个是博主见过最有效的。
对于新版本的express,按照书本上那样链接数据库会报错,链接数据库须要的文件时settings.js,这个按照书上的来没有问题,可是models中的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, {}));
可能会出现下面的问题:
博主google以后,才发现须要按照下面的格式书写:
var settings = require('../settings'), Db = require('mongodb').Db, Connection = require('mongodb').Connection, Server = require('mongodb').Server; module.exports = new Db(settings.db, new Server(settings.host, Connection.DEFAULT_PORT, {}), {safe: true});
在引用settings模块的时候,若是按照书中的:
var settings = require('../settings');
会出现:
这是由于最新的express版本中须要这样引用这个模块:
var settings = require('./settings');
可是解决了这个问题以后,相继出现了下面这个使人蛋疼的状况:
一开始我也是琢磨不透,可是google的时候,有一个哥们作了很好的解答:
http://www.cnblogs.com/yumianhu/p/3709558.html
也就是说,在express4中咱们须要本身安装express-session包,而后添加引用:
var session = require('express-session');
原来的数据库引用也须要改为:
var MongoStore = require('connect-mongo')(session);
而这些代码:
app.use(express.session({ secret: settings.cookie_secret, store:new MongoStore({ db: settings.db }) }));
就须要改写成:
app.use(session({ secret: settings.cookie_secret, store: newMongoStore({ db : settings.db, }) }));
对于书中提到的视图交互,本来的代码是:
app.dynamicHelpers({ user: function(req, res) { return req.session.user; }, error: function(req, res) { var err = req.flash('error'); if (err.length) return err; else return null; }, success: function(req, res) { var succ = req.flash('success'); if (succ.length) return succ; else return null; }, });
在最新版本的express中须要改为:
app.use(function(req, res, next){ console.log("app.usr local"); res.locals.user = req.session.user; res.locals.post = req.session.post; var error = req.flash('error'); res.locals.error = error.length ? error : null; var success = req.flash('success'); res.locals.success = success.length ? success : null; next(); });
注册页面中用到了flash,可是最新版本的express已经不支持flash了,你须要先使用npm install connect-flash。而后在app.js中添加以下代码:
app.use(flash());
接下来按照书上的步骤走,基本不会出问题了,最后咱们就能获得咱们想要的效果啦~:
须要说明一下的是,跟着书本写这个小应用的时候,出现了不少问题,也就是上面遇到的不少问题,可是博主都是本着自主研究的精神不断google,终于跳出神坑,获得了最后的效果,但愿看到这篇博客的朋友好好研读,也好好看看下面的连接,里面极可能也是你遇到的问题,若是你在跟着书本编写代码的过程当中遇到了问题,欢迎一块儿交流~
参考资料: