陈旧的《Nodejs开发指南》 微博项目实现

573 查看

Nodejs开发指南PDF(原有的下载地址失效了,想要pdf的朋友可以戳我):
http://wenku.baidu.com/link?url=RSy6donQq0guPBwwFZiWjPGJzzINmuierqZJr9ZMxfivll2gw2AtK9SNu_BGAsEBq5-WMyaZwzpQeDoyWM_t67eLOCsHOnhO5LF4onWva8y

项目完整代码:
https://github.com/chnmagnus/MBlog

一个基于express和mongodb 的简单微博项目,具体描述详见《Nodejs开发指南》。
网上也有一些该项目实现的代码,但是基本都是几年前的= =,许多代码都无法运行,各种search之后终于用各种最新版本的代码实现了这一项目,特此记录,分享。


简单说一下我的代码相对书中代码的变化:

1.ejs模板,layout.js被废弃,所以我使用include来提升代码的复用性。
将html代码的head及nav部分放在header.ejs中,将页脚部分放在footer.ejs中,然后在需要的部分使用<%- include header.ejs %>的方式来进行引入。


2.app.METHOD(URL,function) 改为 app.use(URL,routes);
其中var routes = require('./routes/index');


3.书中使用req.flash()来实现服务器返回信息的显示,但是该方法在很久之前被废除。
解决方法一:
如果想继续使用req.flash(),需要require('connect-flash')模块(https://github.com/jaredhanson/connect-flash),但这个模块也已三年没有更新过了= =,我并不确定是否能用。
解决方法二:
我是使用了res.locals.xxx;以及添加中间件的方式来进行信息的反馈。在需要返回信息给客户端的位置,例如登录成功时,使用如下代码:

res.lacals.result = '登录成功';
res.redirect('/');

配合app.js中的部分代码:

var session = require('express-session');
var MongoStore = require('connect-mongo')(session);
//...
app.use(session({
  name: settings.name,
  secret: settings.secret,
  cookie: {
    maxAge: 1000*60*30
  },
  store: new MongoStore({
    url: settings.url
  })
}));
//...
//这部分代码是放在对具体路径进行处理之前的
app.use(function (req,res,next) {
  res.locals.user = req.session.user;
  var result = req.session.result;
  delete req.session.result;
  res.locals.message = ''; 
  if(result){
    res.locals.message = result;
  }
  next();//中间件传递
});

当然,不要忘记修改ejs模板,在开头添加代码用来显示反馈信息:

 <% if (message) { %>
  <div class="alert alert-success">
    <%= message %>
  </div>
  <% } %>

效果如下图:


4.使用了官方推荐的MongoClient方式来进行数据库的连接,关于这种方式的模块化,我也存有困惑,在segmentfault上提过问题= =,没有得到回答,自己摸索着解决的,可以看我的提问。

大概就是这样,共勉,一起努力= =