ndoe.js-6

片段视图

片段视图是指一个页面的陪段,通常是重复的内容,用于迭代显示,通过它你可以将相对独立的页面块分割出去,而且可以避免显示地使用for循环。

app.get('/list',function(req,res){

  resresder('list',(

  title:'List',

  items:[1991,'zjx',express','Node.js']

  });

});

在views目录下新建list.ejs,内容是:

<ul><%- partial('listname',items)  %></ul>

新建listitem.ejs,内容是:

<li><%= listitem %></li>

partial是一个可以在视图中使用函数,接受两个参数,以恶搞是片段视图的名词,第二个可以是一个对象或一个数组,如果是一个对象,那么片段视图中上下文变量引用的就是这个对象;

如果是一个数组,那么其中每个元素依次被迭代应用到片段视图。


视图助手

它是允许在视图中访问一个全局的函数或对象,不用每次调用视图解析的时候单独传入,前面提到的partial就是一个视图助手。

视图助手有两类,分别是静态视图助手和动态视图助手。这两者的差别在于,静态视图助手可以是任何类型的对象,包括接受任意参数的函数,但访问到的对象必须是与用户请求无关的,而动态视图只能是一个函数,这个函数不能接受参数,但可以访问req和res对象。

静态视图助手可以通过app.helpers()函数注册,它接受一个对象,对象的每个函数名称为视图助手的名陈,属性值对应视图助手的值。

动态视图助手则通过app.dynamicHelpers()注册,方法与静态视图助手相同,但每个属性的值必须为一个函数,该函数提供req和res。

例如:

var util=require('util');

app.helpers({

   inspect:function(obj){

   return util.inspect(obj,true);

  }

});

app.dynamicHelpers({

   haeders:function(req,res){

   return req.headers;

}

});


做微博网站之前,我们需要闲分析这个网站的主要功能,需要先行规划。以用户的角度开始。首先注册、登录肯定少不了。登录成功后就是微博最核心的信息发表。信息评论、转发、圈点用户能功能。

有了这些功能设计,就可以开始路由规划,或者说控制器规划

规划方案:

首页是必须的    /:

用户的主页      /u/[user]

发表消息         /post

用户注册        /reg

用户登录       /login

用户登出       /logout


其中发表消息和用户登出页面必须是已登录用户才能操作的功能

而用户注册和用户登入所面向的对象必须是未登入的用户。

首页和用户主页则针对已登入和未登入的用户显示不同的内容。

//微博网站添加路由规则
app.get('/u/:user',routes.user);
app.post('/post',routes.post);
app.get('/reg',routes.reg);
app.post('/reg',routes.doReg);
app.get('/login',routes.login);
app.post('/login',routes.doLogin);
app.get('/logout',routes.logout);

/post、/login、/reg路由规则需要接受表单信息,因此使用app.post注册路由

/login、/reg还需要显示用户注册时要填写的表单,


在routes/index.js中添加相应的函数:

exports.user=function(req,res){
};
exports.post=function(req,res){
};
exports.reg=function(req,res){
};
exports.doReg=function(req,res){
};
exports.login=function(req,res){
};
exports.doLogin=function(req,res){
};
exports.logout=function(req,res){
};


数据库介绍

NoSQL Not Only SQL指非关系型,分布式,不提供ACID的数据库系统。

MongoDB  是一种对象数据库,它没有表,行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储。所谓文档就是一个关联数组组式对象,它的内容由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组、甚至是一个嵌套文档。

MongoDB文档示例

{ "_id" : ObjectId("aasdasd7a98s7d98a6s8d"),

    "uid"  :2004,

     "username" : "zjx"

     "net9"  :  { "nickname" : "zhoujx"

                        "asdasd" : "asdasdasd"

                       "emails"  : ["asdad@mail.com" , "asldkjlk@gmail.com"],

                        "asasda" : "asdasdasd",

                      }

}

uid是一个整数属性、username是字符才,_id是文档对象的标识符,格式为特定的ObjectId。net9是一个嵌套的文档,其内部结构与一般文档无异,从格式看来文档好像JSON。MongoDB的数据格式就是JSON,与JS的亲和力很强,在MongoDB中对数据的操作都是以文档为单位的,当然我们也可以修改文档的部分属性。


安装MongoDB

http://www.mongodb.org选择你需要的下载版本,比如所linux-32bit

在/www下新建一个mongodb的文件夹 

在mongodb下新建data和log文件夹,用于存发数据和日志

将下载的mongodb解压到/www/mongodb文件夹下,并重命名为mongodb,查看子目录下是否存在mongod的文件

在/www/mongodb/mongodb下运行

bin/mongod --dbpath /www/mongodb/data -logpath /www/mongodb/logs/mongodb.log。表示将默认数据库

运行bin目录下的mongod查看输出信息,如果输出的是mongodb的信息,说明安装成功。(我的提示过有个/data/db文件找不到,新建后就没问题了)

数据库安装好了,接下来就开始使用。



连接数据库

在工程目录的package.json中将源码

dependencies中添加一项

“mongodb” :' ">=0.9.9"

在运行npm  install更新依赖的模板

新建一个用于保存数据库连接信息的文件Setting.js保存在工程目录中

module.exports= {
   cookieSecret: 'microblogzjx',//用于Cookie加密与数据库无关
   db : 'microblog',//数据库的名称
   host : 'localhost',//数据库的地址
};

在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(sertting.host,Connection.DEFAULT_PORT,{}));


获取connect-mongo模块

在package.json添加一行

"connect-mongo" : ">=0.1.7"

再运行npm install获得模块


在app.js中添加

//会话支持
var MongoStore =require('connect-mongo');
var settings = require('../settings');
app.configure(function(){
app.set('views',__dirname+'/views');
app.set('view engine','jade');
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(express.cookieParser());//Cookie解析的中间件
app.use(express.session({//提供会话支持,设置他的store参数为MongoStore实例,把会话信息存储到数据库中
secret:settings.cookieSecret,
store: new MongoStore({
db:settings.db
})
}));

app.use(app.router);

       //app.use(express.router(routes));//这种方法报错。还没解决

app.use(express.static(__dirname+'/public'));
)};

routes(app);

删除app.js

中的所有路由规则

改写到/routes/index.js中的方法(下面是index.js的所有内容,其余的删除掉)

//index.js

module.exports=function(app){
app.get('/',function(req,res){
res.render('index',{
title:'首页'
});
});
app.get('/reg',function(req,res){
res.render('reg',{
title:'用户注册'
});
});
}

现在可以试着运行一下 node app.js多测试测试,防止出现bug却不知道是修改了哪里

(1.启动是提示过链接不上数据库,因为我没有启动数据库导致)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值