片段视图
片段视图是指一个页面的陪段,通常是重复的内容,用于迭代显示,通过它你可以将相对独立的页面块分割出去,而且可以避免显示地使用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" : ["[email protected]" , "[email protected]"],
"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中添加
//会话支持app.use(app.router);
//app.use(express.router(routes));//这种方法报错。还没解决
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.启动是提示过链接不上数据库,因为我没有启动数据库导致)