nodejs开发微博实例


Posted in NodeJs onMarch 25, 2015

之前一直执着于前端开发,最近几天,开始学起了nodejs。作为一名前端开发者,见到这样一门用javascript写的后台自然是很激动的。但是,后台毕竟不同于前端,在学习的过程中,还是会遇到不少问题。

为了开始学习nodejs,一开始选择了《深入浅出nodejs》这本书,看了几章之后,得出一个结论是:真是一本好书,但是还是不会写nodejs!然后选择了另外一本教材《nodejs开发指南》,由于看过了《深入浅出nodejs》,直接跳过了这本书的前几章,写起了该书第五章的微博实例。作为一个新手,在写的过程中,才逐渐发现因为express版本升级的原因,书中的代码很多已经不能用了,这对于新手来讲,真是痛苦的经历!!本着分享和学习的精神,特此奉上《nodejs开发指南》微博实例express4.x版本源码和编写过程中需要注意的问题。

首先我们看看当前express的版本:

nodejs开发微博实例

这和书本所用的express2.x版本已经有了很大的变化。对于express4版本的新特性,可以看看这个:http://scotch.io/bar-talk/expressjs-4-0-new-features-and-upgrading-from-3-0

话不多说,我们开始我们创建项目之旅。

首先我们新建一个文件夹,用cmd进入文件夹,准备创建项目。按照书中提到的,创建项目的命令应该是:

express -t ejs microblog

问题是express -t参数已经失效,最新的express版本的默认模板引擎是jade,所以为了使用ejs,我们需要像下面这样创建项目:

express -e ejs microblog

按照书中所说的,我们直接运行代码:

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代码到我们新建的文件上面。然后运行代码,就能看到下面的效果了:

nodejs开发微博实例

以上的步骤都不算什么问题,问题就出在连接数据库的一系列问题!如下所述:

为了执行下面的操作,我们首先需要安装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, {}));

可能会出现下面的问题:
nodejs开发微博实例
博主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');

会出现:

nodejs开发微博实例

这是因为最新的express版本中需要这样引用这个模块:

var settings = require('./settings');

但是解决了这个问题之后,相继出现了下面这个令人蛋疼的情况:

nodejs开发微博实例

一开始我也是琢磨不透,但是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());

接下来按照书上的步骤走,基本不会出问题了,最后我们就能得到我们想要的效果啦~:

nodejs开发微博实例

需要说明一下的是,跟着书本写这个小应用的时候,出现了很多问题,也就是上面遇到的很多问题,但是博主都是本着自主研究的精神不断google,终于跳出神坑,得到了最后的效果,希望看到这篇博客的朋友好好研读,也好好看看下面的链接,里面很可能也是你遇到的问题,如果你在跟着书本编写代码的过程中遇到了问题,欢迎一起交流~

以上就是本文的全部内容了,请您花一点时间将文章分享给您的朋友或者留下评论。我们将会由衷感谢您的支持!

NodeJs 相关文章推荐
基于NodeJS的前后端分离的思考与实践(二)模版探索
Sep 26 NodeJs
Nodejs极简入门教程(一):模块机制
Oct 25 NodeJs
nodejs利用http模块实现银行卡所属银行查询和骚扰电话验证示例
Dec 30 NodeJs
浅谈nodejs中的类定义和继承的套路
Jul 26 NodeJs
基于nodejs实现微信支付功能
Dec 20 NodeJs
nodejs爬虫初试superagent和cheerio
Mar 05 NodeJs
nodejs acl的用户权限管理详解
Mar 14 NodeJs
详解Nodejs内存治理
May 13 NodeJs
nodejs文件夹深层复制功能
Sep 03 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 05 NodeJs
nodeJs的安装与npm全局环境变量的配置详解
Jan 06 NodeJs
Nodejs在局域网配置https访问的实现方法
Oct 17 NodeJs
nodejs中实现阻塞实例
Mar 24 #NodeJs
nodejs中使用多线程编程的方法实例
Mar 24 #NodeJs
nodejs中实现sleep功能实例
Mar 24 #NodeJs
nodejs中的fiber(纤程)库详解
Mar 24 #NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 #NodeJs
Nodejs关于gzip/deflate压缩详解
Mar 04 #NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 #NodeJs
You might like
Smarty模板引擎缓存机制详解
2016/05/23 PHP
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
jquery中对于批量deferred的处理方法
2014/01/22 Javascript
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
Bootstrap前端开发案例二
2016/06/17 Javascript
BootStrap实现响应式布局导航栏折叠隐藏效果(在小屏幕、手机屏幕浏览时自动折叠隐藏)
2016/11/30 Javascript
jquery做个日期选择适用于手机端示例
2017/01/10 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
three.js中3D视野的缩放实现代码
2017/11/16 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
2018/05/31 jQuery
webpack之引入图片的实现及问题
2018/10/08 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
[02:20]DOTA2中文配音宣传片
2013/05/22 DOTA
[01:17:12]职来职往完美电竞专场
2014/09/18 DOTA
python调用java的Webservice示例
2014/03/10 Python
使用Python对IP进行转换的一些操作技巧小结
2015/11/09 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
Python自定义装饰器原理与用法实例分析
2018/07/16 Python
pycharm安装和首次使用教程
2018/08/27 Python
对python以16进制打印字节数组的方法详解
2019/01/24 Python
python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例
2020/02/28 Python
CSS3五个技巧给你的网站带来出色的效果
2009/04/02 HTML / CSS
新奇的小玩意:IWOOT
2016/07/21 全球购物
枚举和一组预处理的#define有什么不同
2016/09/21 面试题
幼儿园中班新学期寄语
2014/01/18 职场文书
创建青年文明号材料
2014/05/09 职场文书
村安全生产责任书
2014/08/25 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
幼儿园托班开学寄语(2016春季)
2015/12/03 职场文书
股东出资协议书
2016/03/21 职场文书
python实现ROA算子边缘检测算法
2021/04/05 Python
python爬虫之爬取笔趣阁小说
2021/04/22 Python