《node.js开发指南》中“微博系统”在express3.0+版本下的实现
《node.js开发指南》 出版于2012年,作者是一位2010级的清华学生,是当时国内第一本讲node.js的中文书。 这本书适合于Node.js的入门学者,但是由于年代关系,并且由于Node.js这几年的飞速发展,该书的例子用法在现在已经不适用。本文整理了该书中实现的“微博系统”在express3.0下实现过程中,博主所遇到的问题,以及搜集到的解决方法,分享给各位。
该博文写于2014年4月10日,用的Node的版本为0.10.5,express版本为3.2.4
Node版本:
express版本:
1 express3.0默认不支持layout模板
即生成的ejs文件中没有layout.ejs, 故博主舍弃了layout的写法,创建文件header.ejs和footer.ejs,将layout的头部和尾部分别写入header.ejs和footer.ejs中,要使用时就在其他ejs文件中用<%- include header %>和<%- include footer %>引用得到。
2 在routes/index.js中添加module.exports = function(app)时,出现错误
Error: .get() requires callback functions but got a [object Undefined]
解决方法:
在app.js中删除以下代码:
并改为:
1 routes(app);
3 app.use(express.router(routes)); 报错
解决方法:
在app.js中,找到:
1 app.use(express.router(routes));
将之改为:
1 app.use(app.router);
3 Mongodb连接出错
解决方法:
在app.js中,将
1 MongoStore = require('connect-mongo');
改为
1 MongoStore = require('connect-mongo')(express);
5 点击注册后 显示 ReferenceError: crypto is not defined
解决办法:
在routes/index.js中, 文件头部加入
1 var crypto = require('crypto'); 2 var User = require('../models/user.js');
6 不存在dynamicHelpers 的方法
解决方法:
在app.js中将dynamicHelpers部分的代码:
1 app.dynamicHelpers({ 2 /* .......*/ 3 });
替换为:
1 app.use(function(req, res, next){ 2 var error = req.flash('error'); 3 var success = req.flash('success'); 4 res.locals.user = req.session.user; 5 res.locals.error = error.length ? error: null; 6 res.locals.success = success.length ? success: null; 7 next(); 8 });
7 不存在flash方法
解决方案:
在新版express中去除了flash, 我们可以使用connect-flash代替之。
在cmd中进入项目文件夹,安装connect-flash, npm install connect-flash
并在app.js中添加以下代码
1 var flash = require('connect-flash'); 2 app.use(flash());
注意: 要在flash的使用处之前添加。
8 partial方式无法使用
网上找到的方法是:
在cmd中进入目录,安装partials,
1 npm install express-partials
在app.js中添加以下代码
1 var partials = require('express-partials'); 2 app.use(partials());
可是博主这里出现posts的值没有传入的问题。于是博主抛弃了partial的用法,改为include用法。
也就是将users.ejs改为:
1 <% if (user) { %> 2 <%- include say %> 3 <% } %> 4 <%- include post %>