快速开发多人博客第1章express mongodb搭建nswbmw blog wiki_第1页
快速开发多人博客第1章express mongodb搭建nswbmw blog wiki_第2页
快速开发多人博客第1章express mongodb搭建nswbmw blog wiki_第3页
快速开发多人博客第1章express mongodb搭建nswbmw blog wiki_第4页
快速开发多人博客第1章express mongodb搭建nswbmw blog wiki_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ThisSearchortypeaMacro-Bin nswbmwEditPageCloneNewEditPageCloneNew第1ExpressMongoDB搭建多人博客express是Node.js上最流行的Web开发框架。关于express的知识请查阅本书 npmnpminstall-g windows下打开cmd切换到D盘,输入 (注意express3.*中安装ejs不再是-t而是-e,可以输入 node node npmnpm

public:存放image、css、js等文件 *Modulevarexpress=require('express');varroutes=require('./routes');varuser=require('./routes/user');varhttp=require('http');varpath=require('path');varapp=express();//allapp.set('port',process.env.PORT||3000); dirname+'/views');app.set('viewengine','ejs'); dirname,//developmentif('development'=={}app.get('/',routes.index);app.get('/users',user.list);function(){console.log('Expressserverlisteningonport'+

app.set('views',dirname+'/views'):设置views文件夹为存放视图文件的 ,即存放模板文件,dirname为全局变量,着当前 dirname+app.use(express.logger('dev')):connect内建的中间件,在开发环境下使用,在终端显示简单的日志,比如在启动 dirname+ExpressExpressserverlisteningonport3000GET/20021ms-206bGET/stylesheets/style.css304Expressserverlisteningonport3000app.use(express.bodyParser()):app.use(express.methodOverride()):connect内建的中间件,可以协助处理POST请求,PUT、DELETE和其他HTTP方法。 (''==')){exports.indexexports.index=res){res.render('index',{title:'Express'});app.get('/', app.get('/',app.get('/',app.get('/',res){res.render('index',{title:'Express'}); dirname+ dirname+function(){console.log('Expressserverlisteningonport'+app.get('/', app.get('/',app.get('/',app.get('/',res){res.render('index',{title:'Express'});现路由功能的函数都放到index.js里,app.js中只有一个总的路由接口。 app.get('/',routes.index);app.get('/users',app.get('/',routes.index);app.get('/users',user.list);module.exports={app.get('/',function(req,res)res.render('index',{title:'Express' //GET/search?q=tobi+ferret//=>"tobi//GET/shoes?order=desc&shoe[color]=blue&shoe[type]=converse//=>//=>//=>////POST//=>//=>"//POST{"name":"tobi"//=>//GET/user/tj//=>//GET/file/javascripts/jquery.js//=>//?name=tobi//=>//POSTname=tobi//=>///user/tobifor/user/:name//=> 的路由规则,而且它也不是一个public 下面我们来添加这条路由规则,使得当localhost:3000/nswbmw时,页面显示 app.get('/nswbmw',app.get('/nswbmw',function(req,{ 问题,XSLT并不是很流行。目前的主流还是由服务器运行模板引擎。输入,生成HTML页面,然后返回给控制器,由控制器交回客户端。 dirname+'/views');app.set('viewengine','ejs'); <!DOCTYPE<!DOCTYPE<title><%=title<linkrel='stylesheet'href='/stylesheets/style.css'<h1><%=title eto<%=titleres.render('index',{title:'Express' res.render('index',{title:'Express'<!DOCTYPE<linkrel='stylesheet'href='/stylesheets/style.css' etoapp.use(express.static(path.join(dirname,注意:我们设置了静态为app.use(express.static(path.join(dirname,

。<%=code<%-code <%=code <%-code <%=code<%-code <%=code <%-codeThes:s:['mop','broom',TheTem<%for(vari=0;s.length;i++) s[i]<%}The<%-<%-includeb%><%-<%-includecthisthisisthisthisisthisthisisthisisc/login/reg/post /logout/logoutmodule.exportsmodule.exports={app.get('/',function(req,res)res.render('index',{title主页app.get('/reg',function(req,{res.render('reg',{title: 'app.post('/reg',function(req,res)app.get('/login',function(req,{res.render('login'title:登录app.post('/login',function(req,res)app.get('/post',function(req,{res.render('post',{title: 'app.post('/post',function(req,res)app.get('/logout',function(req,res){{"_id":ObjectId("4f7fe8432b4a1077a7c551e8""name":"nswbmw","age":22, ":[ ", ""family":"mother":{..."father":{..."sister:{...},"address":}}安装d:\mongodb\bin\mongod.exe-dbpath启动重命名为mongodb,并在mongodb文件夹里新建blog文件夹作为我们博客内容的。打开cmd,切换到d:\mongodb\bin下,然后输入mongod-dbpathd:\mongodb\blog设置blog文件夹作为我们工程的并启动。为了方便以后使用数据库,我们在桌面上新d:\mongodb\bin\mongod.exe-dbpath启动启动启动

连接{"name":"version":"0.0.1","private":true,"scripts":{"start":"node{"express":"3.3.8","ejs":"*","mongodb":}}npm npm 务器在本地,因此settings.js文件的内容如下:module.exportsmodule.exports Secret:'myblog',db:'blog',host: 下新建models文件夹,并在models文件夹下新建db.js,添加如下代码:varsettings=require('../settings'),Db=require('mongodb').Db,Connection=require('mongodb').Connection,Server=require('mongodb').Server;module.exports=newDb(settings.db,newServer(settings.host,Connection.DEFAULT_PORT,newnewDb(settings.db,newServer(settings.host,Connection.DEFAULT_PORT,

功能,如PHP,把每个唯一标识符到文件中。便于持久。为了使用这能,我们首先要获取一个叫做connect-mongo(参见 块,在package.json中添加一行代码:{{"name":"version":"0.0.1","private":true,"scripts":"start":"node{"express":"3.3.8","ejs":"*","mongodb":"connect-mongo":}}npmvarpath= npmvarpath=varvarMongoStore=require('connect-mongo')(express);varsettings=require('./settings'); secret:settings. key:settings.db,:{maxAge:1000*60*60*24*30},//30daysstore:newMongoStore({db: 是解析的中间件。 则提供会话支持,secret用来防止篡改,key的值为的名字,通过设置的maxAge值设定的生存期,这里我们设置的生存期为30天,设置它的store参数为修改views/index.ejs如下:<%-<%-includeheader<%-includefooter<!DOCTYPE<!DOCTYPE<metacharset="UTF-8"<linkrel="stylesheet"<h1><%=title<span><atitle="主页"<span><atitle="登录"<span><a "/*/*inspiredby/body{width:600px;margin:2emauto;padding:02em;font-size:14px;font-p{line-height:24px;margin:1emheader{padding:.5em0;border-bottom:1pxsolidnav{position:fixed;left:12em;font- YaHei";font-size:1.1em;text-transform:uppercase;width:9em;text-nav y:block;text-decoration:none;padding:.7emnava:hover{background-color:#ff0000;color:#f9f9f9;-webkit-transition:color.2slinear;}articlea{color:#dd0000;text- a:hover{color:#333333;{font-<%-<%-includeheader<form用户名:<inputtype="text"name="name"/><br <inputtype="password"name="password"/><br<inputtype="submit"value="登录<%-includefooter<%-<%-includeheader<form用户名:<inputtype="text"name="name"/><br:<inputtype="password"name="password"/><br:<inputtype="password"name="password-repeat"/><br/><input" "/><br<inputtype="submit" <%-includefooter nodenode启动启动启动启动 启动启动启动启动什么是flash?我们所说的flash即connect-flash模块(详见 间件是从Express2.x提取出来的,Express3.x不再支持,但是通过connect-flash外部模块可以实现这个功能。{"name":"version":"0.0.1","private":true,"scripts":{"start":"node{"express":"3.3.8","ejs":"*","mongodb":"connect-mongo":"connect-flash":}}npmvarsettings= npmvarsettings=varvarflash=require('connect- 在models文件夹下新建user.js,添加如下代码:varvarmongodb=function{=;this.password=user.password; =user. module.exports= Utotype.save=function(callback)varuser={name:,password:this.password,:mongodb.open(function(errdb){if(err)returncallback(err);//错误,返回err}//users集db.collection('users',function(err,{if(err){returncallback(err);//错误,返回err}//将用户数据插入userscollection.insert(user,{safe:true},function(err,{mongodb.close();//callback(null,user[0]);//成功!err为null,并返回后的文//用户信User.get=function(name,callback)mongodb.open(function(errdb){if(err)returncallback(err);//错误,返回err}//users集db.collection('users',function(err,{if(err){returncallback(err);//错误,返回err}//查找用户名(name键)值为nameme:name},数据库if(user){returncallback(null,user);//}callback(err);//失败!返回err varvarcrypto=User= app.post('/reg',app.post('/reg',function(req,{varname=,password=req.body.password,password_re=req.body['password-//检验用户两次输入 是否一if(password_re!=password){req.flash('error','两次输入的 returnres.redirect('/reg');}//生 的md5varmd5=password=md5.update(req.body.password).digest('hex');varnewUser=newUser({name:password:password,:req.body.//User.get(newU,function(err,{if(user)req.flash('error','用户已存在returnres.redirect('/reg');//用户名存在则返回}newUser.save(function(erruser)if{req.flash('error',return}req.session.useruser;//sessionreq.flash('success','成功!');']res.redirect:重定向功能,实现了页面的跳转,关于res.redirect的信息请查阅:ht 面的代码中,我们直接使用了User对象。User是一个描述数据的对象,即MVC架构中的模型。前面我们使用了许多视图和控制 <span><atitle="主页"<%if(user){<span><a "<span><atitle="登出"<%}else{<span><atitle="登录"<span><a "<%} <%if(success){<div><%=success<%}<%if(error){<div><%=error%><%} app.get('/',function(req,res.render('index'title:'主页',user:success:req.flash('success').toString(),error:req.flash('error').toString() app.get('/reg',app.get('/reg',function(req,{res.render('reg',{title:' user:success:req.flash('success').toString(),error:req.flash('error').toString()req.flash('success',' 成功赋给变量user,在渲染ejs文件时通过检测user判断用户是否,根据用户状态的不同显示不同的导航信息。req.flash('success',' 成功success:error:success:error:req.flash('error','用户不存在

,打开index.js app.post('/login',app.post('/login',function(req,res)//生 的md5varmd5=password=//User.get(,function(err,{if(!user)req.flash('error','用户不存在returnres.redirect('/login');//}//检 是否一if(user.password!={req.flash('error',' return } 都匹配后,将用户信息存入sessionreq.session.user=user;req.flash('success','登陆成功!'); app.get('/logout',function(req,{req.session.user=null;req.flash('success登出成功!'); functioncheckLogin(req,res,next){if(!req.session.user)req.flash('error未登录!');}}functioncheckNotLogin(req,res,next){if(req.session.user)req.flash('error已登录!');}}

varcrypto=User=module.exports={app.get('/',function(req,res){title主页user:success:req.flash('success').toString(),error:req.flash('error').toString()app.get('/reg',checkNotLogin);app.get('/reg',function(req,res){{title:'user:success:req.flash('success').toString(),error:req.flash('error').toString()app.post('/reg',checkNotLogin);app.post('/reg',function(req,res){varname=,password=req.body.password,password_re=req.body['password-//检验用户两次输入的是否一if(password_re!=password){req.flash('error','两次输入的不一致!');returnres.redirect('/reg');}//生成的md5varmd5=password=md5.update(req.body.password).digest('hex');varnewUser=newUser({name:,password:password,:req.body.//User.get(newU,function(err,{if(user)req.flash('error','用户已存在returnres.redirect('/reg');//用户名存在则返回}newUser.save(function(erruser)if{req.flash('error',err);}req.session.useruser;//sessionreq.flash('success','成功!');app.get('/login',checkNotLogin);app.get('/login',function(req,res){title登录user:success:req.flash('success').toString(),error:req.flash('error').toString()app.post('/login',checkNotLogin);app.post('/login',function(req,res){//生成的md5varmd5=password=//User.get(,function(err,{if(!user)req.flash('error','用户不存在returnres.redirect('/login');//}//检查是否一if(user.password!={req.flash('error','错误returnres.redirect('/login');//错误则跳转到登录}//用户名都匹配后,将用户信息存入sessionreq.session.user=user;req.flash('success','登陆成功!');app.get('/post',checkLogin);app.get('/post',function(req,res){{title:'user:success:req.flash('success').toString(),error:req.flash('error').toString()app.post('/post',checkLogin);app.post('/post',function(req,res){app.get('/logout',checkLogin);app.get('/logout',function(req,res){req.session.user=null;req.flash('success','登出成功!');functioncheckLogin(req,res,{if(!req.session.user){req.flash('error','未登录!');}}functioncheckNotLogin(req,res,{if(req.session.user){req.flash('error','已登录!');}}}

user:user:success:req.flash('success').toString(),error:req.flash('error').toString()<%-<%-includeheader<form标题:<br<inputtype="text"name="title"/><br正文:<br<textareaname="post"rows="20"cols="100"></textarea><br<inputtype="submit" "<%-includefootervarvarmongodb=functionPost(name,title,{=name;this.title=title;this.post=post;}module.exports= Ptotype.save=function(callback){vardate=newDate(); vartime=date:year:month:date.getFullYear()+"-"+day:date.getFullYear()+"-"+(date.getMonth()+1)+"-"+minute:date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate()+""+date.getHours()+":"+}varpost={name:,time:time,title:this.title,post:this.post

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论