nodejs开发博客记录Word格式.docx
《nodejs开发博客记录Word格式.docx》由会员分享,可在线阅读,更多相关《nodejs开发博客记录Word格式.docx(27页珍藏版)》请在冰豆网上搜索。
module.exports=function(app){
app.get('
function(req,res){});
}
博客系统中的index.js的雏形:
function(req,res){
主页'
/reg'
reg'
注册'
app.post('
/login'
login'
登录'
/logout'
/post'
post'
发表'
你会发现reg、login和post都有get和post方法,我们可以这么理解:
get方法是实现当用户试图访问这个网页时要显示些什么,post方法是当从这个网页上发出数据(这里时提交表单)时要干些什么,所以访问/和/logout就不需要post方法了。
render函数的意思是,当你要访问比如主页时,服务器找到index.ejs文件并替换变量title的值为字符串’主页’
路由控制的雏形出来了,下面写视图部分,在views下面新建几个文件,index.ejs、login.ejs、reg.ejs、post.ejs,然后再给每个页面添加统一的头部导航(header.ejs)和底部说明(footer.ejs),使用的时候把<
%-includeheader%>
和<
%-includefooter%>
分别放在头尾就行了。
header.ejs
<
!
DOCTYPEhtml>
html>
head>
metahttp-equiv="
Content-Type"
content="
text/html;
charset=UTF-8"
>
title>
Blog<
/title>
linkrel="
stylesheet"
href="
stylesheets/style.css"
/head>
body>
header>
h1>
%=title%>
/h1>
/header>
nav>
span>
atitle="
主页"
/"
主页<
/a>
/span>
登录"
/login"
登录<
注册"
/reg"
注册<
/nav>
article>
footer.ejs
/article>
/body>
/html>
index.ejs
%-includeheader%>
这是主页
%-includefooter%>
login.ejs
formmethod="
post"
name="
form"
id="
<
table>
tbody>
tr>
td>
labelfor="
username"
用户名:
/label>
/td>
inputtype="
text"
placeholder="
请输入用户名"
/>
/tr>
password"
密码:
请输入密码"
tdcolspan="
2"
class="
btn"
>
submit"
value="
/tbody>
/table>
/form>
reg.ejs
comfirm_pwd"
再次输入密码:
请再次输入密码"
然后再修改下style.css:
nava:
hover{
background:
#2ECC71;
tr:
last-child{
text-align:
center;
td{
height:
24px;
padding:
5px;
td:
first-child{
right;
left;
tdinput[type="
],tdinput[type="
]{
display:
block;
border:
1pxsolidgray;
border-radius:
3px;
td.btn{
td.btninput{
010px;
font-size:
16px;
font-weight:
bold;
margin-top:
预览下页面:
现在只是实现了视图,逻辑操作还没写,那涉及到数据库了,下一节吧。
nodejs-express开发个人博客
(二)
207次
3
nodejs--express开发个人博客
(2)
上一部分已经实现了视图的雏形,现在加上逻辑操作。
登陆、注册、文章发表都需要用到数据库的数据存取,用的比较多的就是mongodb了。
MongoDB是一个对象数据库,它没有表、行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储。
所谓文档就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档。
下面是一个
MongoDB文档的示例:
{"
_id"
:
ObjectId("
4f7fe8432b4a1077a7c551e8"
),
"
uid"
2004,
byvoid"
net9"
{"
nickname"
BYVoid"
surname"
Kuo"
givenname"
Carbo"
fullname"
CarboKuo"
emails"
["
byvoid@"
"
byvoid.kcp@"
],
website"
"
address"
Zijing2#,TsinghuaUniversity"
}
}
看着眼熟吧?
恩,和json的格式一样。
使用方法:
mongod--dbpathC:
\ProgramFiles\nodejs\mongodb\data--logpath=C:
\ProgramFiles\nodejs\mongodb\logs\mongodb.log--install
去官网下载mongodb,解压到D:
\softdata\nodejs\mongodb,在mongodb文件夹下新建文件夹取名myblog用来存放我们的数据。
然后新打开一个cmd窗口,cd到我们的D:
\softdata\nodejs\mongodb\bin目录下,输入mongod-dbpath"
D:
\softdata\nodejs\mongodb\blog"
设置数据库路径并启动数据库,最小化窗口不要关闭(以后启动也这么启动,另外可以进到bin目录下通过startmongo命令来启动mongodb的控制台,方便查看自己的数据库中的内容,一些常见的命令有:
db.users.find()、db.users.count()、db.users.remove()等,具体是干什么的,自己试过就知道了)。
接下来我们在node中连接mongodb,打开package.json,在dependencies属性中添加一行代码:
mongodb"
:
*"
,然后npminstall安装mongodb模块,接下来在blog文件夹下创建settings.js文件,用于保存数据库的连接信息:
module.exports={
cookieSecret:
myblog'
db:
blog'
host:
localhost'
好了,数据库准备好了,下面就来写数据库存放的数据模型了。
在blog下面新建一个文件夹models用于存放数据模型。
在models下面新建db.js用于配置数据库:
varsettings=require('
../settings'
),
Db=require('
mongodb'
).Db,
Connection=require('
).Connection,
Server=require('
).Server;
module.exports=newDb(settings.db,newServer(settings.host,Connection.DEFAULT_PORT,{}));
接下来安装connect-mongo模块用来存储会话信息到数据库,关于connect-mongo的说明在nodejs开发指南里面做了详细解释,不多说。
在package.json的dependencies中添加一行代码:
connect-mongo"
,npminstall安装connect-mongo模块。
然后在app.js里面引入数据库的相关配置文件就行了,先在“varpath=require('
path'
);
”后添加以下内容:
varMongoStore=require('
connect-mongo'
)(express);
//注意:
后面有(express)
./settings'
在“app.use(express.methodOverride());
”后添加:
app.use(express.cookieParser());
app.use(express.session({
secret:
settings.cookieSecret,
store:
newMongoStore({
settings.db
})
}));
至此数据库的配置已经做好了,下面可以用了。
登录和注册都需要比对数据库中的用户信息。
在models下新建一个user.js,里面封装了对用户的操作:
varmongodb=require('
./db'
functionUser(user){
this.name=user.name;
this.password=user.password;
module.exports=User;
User.prototype.save=functionsave(callback){
varuser={
name:
this.name,
password:
this.password,
};
mongodb.open(function(err,db){
if(err){
returncallback(err);
}
db.collection('
users'
function(err,collection){
mongodb.close();
}
collection.ensureIndex('
name'
{
unique:
true
collection.insert(user,{safe:
true},function(err,user){
callback(err,user);
});
User.get=functionget(username,callback){
collection.findOne({
username
},function(err,doc){
if(doc){
varuser=newUser(doc);
}else{
callback(err,null);
然后在index.js里面修改登录的处理过程,即app.get("
)和app.post("
),修改如下,同时为了使用User,需要在index.js开始的地方引入user.js
function(req,res){
res.render('
title:
'
user:
req.session.user,
success:
req.flash('
success'
).toString(),
error:
error'
).toString()
app.post('
varmd5=crypto.createHash('
md5'
password=md5.update(req.body.password).digest('
base64'
User.get(req.body.username,function(err,user){
if(!
user){
req.flash('
'
用户不存在'
returnres.redirect('
if(user.password!
=password){
密码错误'
req.session.user=user;
'
登陆成功'
res.redirect('
注意到req.flash了?
恩,这个是用于显示错误信息的,需要用到flash模块,在命令行中输入npminstall
connect-flash来安装flash,然后在app.js中varsettings后面加上
varflash=require('
connect-flash'
在“app.set('
viewengine'
ejs'
app.use(flash());
这样就可以使用flash的通知功能了。
还注意到什么没?
crypto!
crypto是Node.js的一个核心模块,功能是加密并生成各种散列,使用它之前首先要声明varcrypto=require('
crypto'
)。
代码中使用它计算了密码的散列值。
到这里,应该登录就写完了,试试?
点击登录按钮没有任何提示?
因为还没有加·
·
为了显示信息,还需要引入视图助手,《node.js开发指南》中这样描述:
“为了实现不同登录状态下页面呈现不同内容的功能,我们需要创建动态视图助手,通过它我们才能在视图中访问会话中的用户数据。
同时为了显示错误和成功的信息,也要在动态视图助手中增加响应的函数。
”
打开app.js,在http.createServer()前添加以下代码:
app.use(function(req,res,next){varerr=req.flash('
success=req.flash('
res.locals.user=req.session.user;
res.locals.error=err.length?
err:
null;
res.locals.success=success.length?
success:
next();
在header.ejs的最后添加以下代码:
%if(locals.success){%>
div>
%=locals.success%>
/div>
%}%>
%if(locals.error){%>
div>
%=locals.error%>
好了,再试试登录?
因为这个时候的数据库是空的,所以用户名不存在。
那接下来就通过注册添加新用户吧?
毕竟mongodb的用法还不是很熟悉。
修改index.js中的reg的get和post处理:
function(req,res){
if(req.body['
password-repeat'
]!
=req.body['
password'
]){
两次输入的口令不一致'
varpassword=md5.update(req.body.password).digest('
varnewUser=newUser({
req.body.username,
password,
User.get(newUser.name,function(err,user){
if(user){
err='
用户已存在'
;
err);
newUser.save(function(err){
err);
req.session.user=newUser;
r