《NodeJs 开发指南》微博例子 express4 + jade 重写

标签: 前端

2016年6月10日


前言

一些参考过的文章和例子:

  1. 使用express4.x版和Jade模板重写《nodejs开发指南》微博实例
  2. nswbmw的github
  3. 我的代码

js部分

书本上的例子主要用express2的语法写的,当我们学习时使用最新的包来运行就会出现问题。问题集中在mongodb的设置、bootstrap的用法还有模板的使用上,本文将以当前可行的语法重写例子。

首先要添加新的包,express4之后将中间件都分离出来了。
exppress-session
connect-flash

//app.js
//...

var flash = require('connect-flash');
var session = require('express-session');
// mongo与session配合的写法
var MongoStore = require('connect-mongo')(session);
var setting = require('./setting');

//...

app.use(flash());  //在use session之前
app.use(session({
    secret: setting.cookieSecret,
    key: setting.db, //cookie的键名
    cookie: {maxAge: 1000 * 60 * 60 * 24 * 7}, //过期时间
    resave: false, //是否每次相关请求都刷新过期时间,必须
    saveUninitialized: false, //是否无论请求内容如何都生成cookie,必须
    store: new MongoStore({
        url: 'mongodb://localhost/' + setting.db
        //可行的写法,生成数据将会在以setting.db命名的库上
    })
})

// 代替视图助手的部分
app.use(function(req, res, next){
  //res.locals上的属性会自动渲染到模板上
  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();
})

app.use(express.static(path.join(__dirname, 'public'))); //有时出问题和这句的位置有关,服务静态文件
// /models/db.js
var setting = require('../setting');
var Db = require('mongodb').Db;
var Connection = require('mongodb').Connection;
var Server = require('mongodb').Server;

module.exports = new Db(setting.db, new Server(setting.host, setting.port, {}), {safe: true});

// setting.js
module.exports = {
    cookieSecret: 'microblogphilo',
    db: 'microblog',
    host: 'localhost',
    port: 27017,
}

文件routes/index.js没啥问题,注意req.flash, req.session, res.redirect别写错

参考资料:
connect-flash
express-session
connect-mongo


jade部分

主要参考jade的用法bootstrap3的用法

//- layout.jade
doctype html
html
  head
    title= title + '- Mircoblog'
    link(rel='stylesheet', href='/stylesheets/bootstrap.min.css')
    link(rel='stylesheet', href='/stylesheets/style.css')

  body
    nav.navbar.navbar-inverse.navbar-fixed-top
      .container-fluid
        .navbar-header
          button.navbar-toggle.collapsed(data-toggle='collapse', data-target='#navbar-nav', aria-expended='false')
            span.sr-only Toggle navigation
            span.icon-bar
            span.icon-bar
            span.icon-bar
          a.navbar-brand(href='/') Microblog

        #navbar-nav.navbar-collapse.collapse
          ul.nav.navbar-nav
            li(class={active: '#{current}' === 'home'}) 
              a(href='/') home
            if (!user)
              li(class={active: '#{current}' === 'login'}) 
                a(href='/login') login
              li(class={active: '#{current}' === 'register'})
                a(href='/reg') register
            else
              li: a(href='/logout') logout
    //- 视图助手部分          
    if (success)
      .alert.alert-success(role='alert', style={'margin-top': '1em'})= success
    if (error)
      .alert.alert-danger(role='alert', style={'margin-top': '1em'})= error
   
    .container(style={'margin-top': '2rem'})
      block content
    
    hr
    footer
      p 
        a(href='https://github.com/chenxxzhe', target='_blank') Philoz 
        | 2016

    script(src='/javascripts/jquery-1.12.4.min.js')
    script(src='/javascripts/bootstrap.min.js')

//- index.jade
extends layout
block content
  if (!user)
    .jumbotron  
      h1 Welcome to Microblog
      p Microblog is built by express
      p
        a.btn.btn-primary.btn-large(href='/login') Login
        a.btn.btn-large(href='/reg') Register Now!
  else 
    include ./say.jade

  include ./post.jade
//- login.jade
extend layout
block content
    form.form-horizontal(method='post')
        fieldset
            legend User Login
            .form-group
                label.col-sm-2.control-label(for='inputUsername')
                    | User Name:
                .col-sm-10
                    input#inputUsername.form-control(type='text', placeholder='User name', name='user')
            .form-group
                label.col-sm-2.control-label(for='inputPassword')
                    | Password:
                .col-sm-10
                    input#inputPassword.form-control(type='password', placeholder='Password', name='pwd')
            button.btn.btn-primary.col-sm-offset-2(type='submit') Login
//- register.jade
extend layout

block content
    form.form-horizontal(method='post')
        fieldset
            legend Register
            .form-group
                lable.col-sm-2.control-label(for='inputUserName') 
                    | User Name:
                .col-sm-10
                    input#inputUserName.form-control(type='text', placeholder='User Name', aria-describedby='help-block', name='user')
                    span#help-block.help-block.
                        User name is used to login and show your name
            .form-group
                label.col-sm-2.control-label(for='inputPassword')
                    | Password:
                .col-sm-10
                    input#inputPassword.form-control(type='password', placeholder='Password', name='pwd')
            .form-group
                label.col-sm-2.control-label(for='inputPasswordAgain')
                    | Password Again:
                .col-sm-10
                    input#inputPasswordAgain.form-control(type='password', placeholder='Password Again', name='pwda')
            button.btn.btn-primary.col-sm-offset-2(type='submit') Register
//- user.jade
extends layout
block content
    if (user)
        include ./say.jade
    
    include ./post.jade
//- post.jade 这部分有点绕,就是要每三个post一行
if (posts)
    - for (var i = 0; i < posts.length; i = i + 3)
        .row
            - var j = 0
            while j < 3 && j + i < posts.length
                .col-sm-4
                    - var name = posts[j+i].user
                    h3
                        a(href='/user/#{posts[j+i].user}')= posts[j+i].user 
                        |  says:
                    p: small: time.text-muted(pubdate='#{posts[j+i].time}')= posts[j+i].time.toLocaleString('en-US',{hour12: false})
                    p= posts[j+i].post
                - j = j + 1

//- say.jade
form.well.text-center(method='post', action='/post')
    .input-group
        label.sr-only(for='inputPost') post content
        input#inputPost.form-control(type='text', placeholder='Say something :)', name='post')
        span.input-group-btn
            button.btn.btn-success(type='submit')
                span.glyphicon.glyphicon-comment post
//- 要用到glyphicon,需要将bootstrap的fonts文件夹复制到public/

运行

要运行这个系统首先要安装并运行mongo的数据库
下载安装请到官网
记得设置环境路径到mongo安装目录的bin上

然后新建数据库并启动
例如在microblog的上一级新建blogdata文件夹
mkdir blogdata
mongod --dbpath blogdata
这样数据库就运行在localhost:27017上

再然后启动express
supervisor -n error DEBUG=mircoblog:* node ./bin/www
supervisor是为了监听node的改动,但网页还是要自己刷新

建议下载robomongo作为mongo的可视化管理工具
Robomongog官网

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容