nodejs开发博客记录.docx_第1页
nodejs开发博客记录.docx_第2页
nodejs开发博客记录.docx_第3页
nodejs开发博客记录.docx_第4页
nodejs开发博客记录.docx_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

nodejs-express开发个人博客(-)www.MyException.Cn发布于:2013-10-08 16:55:16浏览:30次0nodejs-express开发个人博客(-) 写完了入门笔记,开始进入开发阶段吧。基于上一节的内容,现在着手开发个人博客系统。先划分一下功能吧/:首页/login:登陆/reg:注册/post:发表文章/logout:退出首先规划一下路由控制,在现在的app.js中控制路由的语句是app.get(/, routes.index);app.get(/users, user.list);/路由控制每加一个路由控制就要接一句app.get()或者是app.post(),当路由很多时,app.js里面的代码就会很多,不便于维护和修改。所以换一种写法,在index.js里面写路由控制:exports.index = function(req, res) res.render(index, title: Express );同时把app.js里面的路由控制语句换成:routes(app);这是你现在看到的写法,咱们为了简化和便于修改,换成下面这种写法:module.exports = function(app) app.get(/,function(req,res));博客系统中的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: 注册 ); ); app.post(/reg,function(req,res) ); app.get(/login,function(req,res) res.render(login, title: 登录 ); ); app.post(/login,function(req,res) ); app.get(/logout,function(req,res) ); app.get(/post,function(req,res) res.render(post, title: 发表 ); ); app.post(/post,function(req,res) ); ;你会发现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),使用的时候把和分别放在头尾就行了。header.ejsBlog主页登录注册footer.ejsindex.ejs这是主页login.ejs 用户名: 密码: reg.ejs 用户名: 密码: 再次输入密码: 然后再修改下style.css:nav a:hoverbackground: #2ECC71;tr:last-childtext-align: center;tdheight: 24px;padding: 5px;td:first-childtext-align: right;td:last-childtext-align: left;td inputtype=password,td inputtype=textdisplay: block;padding: 5px;border: 1px solid gray;border-radius: 3px;td.btntext-align: center;td.btn inputpadding:0 10px;font-size: 16px;font-weight: bold;margin-top: 5px;预览下页面:现在只是实现了视图,逻辑操作还没写,那涉及到数据库了,下一节吧。nodejs-express开发个人博客(二)www.MyException.Cn发布于:2013-10-08 16:55:16浏览:207次3nodejs-express开发个人博客(2) 上一部分已经实现了视图的雏形,现在加上逻辑操作。 登陆、注册、文章发表都需要用到数据库的数据存取,用的比较多的就是mongodb了。 MongoDB 是一个对象数据库,它没有表、行等概念,也没有固定的模式和结构,所有的数据以文档的形式存储。所谓文档就是一个关联数组式的对象,它的内部由属性组成,一个属性对应的值可能是一个数、字符串、日期、数组,甚至是一个嵌套的文档。下面是一个MongoDB 文档的示例: _id : ObjectId( 4f7fe8432b4a1077a7c551e8 ), uid : 2004, username : byvoid, net9 : nickname : BYVoid, surname : Kuo, givenname : Carbo, fullname : Carbo Kuo, emails : , , website : , address : Zijing 2#, Tsinghua University 看着眼熟吧?恩,和json的格式一样。 使用方法:mongod -dbpath C:Program Filesnodejsmongodbdata -logpath=C:Program Filesnodejsmongodblogsmongodb.log -install 去官网下载mongodb,解压到D:softdatanodejsmongodb,在mongodb文件夹下新建文件夹取名myblog用来存放我们的数据。然后新打开一个cmd窗口,cd到我 们的D:softdatanodejsmongodbbin目录下,输入mongod -dbpath D:softdatanodejsmongodbblog设置数据库路径并启动数据库,最小化窗口不要关闭(以后启动也这么启动,另外可以进到bin目录下通过start mongo命令来启动mongodb的控制台,方便查看自己的数据库中的内容,一些常见的命令有:db.users.find()、db.users.count()、db.users.remove()等,具体是干什么的,自己试过就知道了)。 接下来我们在node中连接mongodb,打开 package.json,在 dependencies 属性中添加一行代码:mongodb:*,然后npm install安装mongodb模块,接下来在blog文件夹下创建 settings.js 文件,用于保存数据库的连接信息:module.exports = cookieSecret: myblog, db: blog, host: localhost; 好了,数据库准备好了,下面就来写数据库存放的数据模型了。 在blog下面新建一个文件夹models用于存放数据模型。 在models下面新建db.js用于配置数据库:var settings = require(./settings), Db = require(mongodb).Db, Connection = require(mongodb).Connection, Server = require(mongodb).Server;module.exports = new Db(settings.db, new Server(settings.host, Connection.DEFAULT_PORT, ); 接下来安装connect-mongo模块用来存储会话信息到数据库,关于connect-mongo的说明在nodejs开发指南里面做了详细解释,不多说。在 package.json 的dependencies中添加一行代码:connect-mongo:*,npm install安装connect-mongo模块。然后在app.js里面引入数据库的相关配置文件就行了,先在“var path = require(path);”后添加以下内容:var MongoStore = require(connect-mongo)(express);/注意:后面有(express)var settings = require(./settings);在“app.use(express.methodOverride();”后添加:app.use(express.cookieParser();app.use(express.session( secret: settings.cookieSecret, store: new MongoStore( db: settings.db ) );至此数据库的配置已经做好了,下面可以用了。登录和注册都需要比对数据库中的用户信息。在models下新建一个user.js,里面封装了对用户的操作:var mongodb = require(./db);function User(user) = ; this.password = user.password;module.exports = User;Utotype.save = function save(callback) var user = name: , password: this.password, ;mongodb.open(function(err, db) if(err) return callback(err); db.collection(users, function(err, collection) if(err) mongodb.close(); return callback(err); collection.ensureIndex(name, unique:true ); collection.insert(user,safe: true, function(err, user) mongodb.close(); callback(err, user); ); ););User.get = function get(username, callback)mongodb.open(function(err, db) if(err) return callback(err); db.collection(users, function(err, collection) if(err) mongodb.close(); return callback(err); collection.findOne( name: username ,function(err, doc) mongodb.close(); if(doc) var user = new User(doc); callback(err, user); else callback(err, null); ); ););然后在index.js里面修改登录的处理过程,即app.get(/login)和app.post(/login),修改如下,同时为了使用User,需要在index.js开始的地方引入user.jsapp.get(/login, function(req, res) res.render(login, title:登录, user:req.session.user, success:req.flash(success).toString(), error:req.flash(error).toString() ); );app.post(/login, function(req, res) var md5 = crypto.createHash(md5), password = md5.update(req.body.password).digest(base64); User.get(req.body.username, function(err, user) if(!user) req.flash(error, 用户不存在); return res.redirect(/login); if(user.password != password) req.flash(error, 密码错误); return res.redirect(/login); req.session.user = user; req.flash(success,登陆成功); res.redirect(/); ););注意到req.flash了?恩,这个是用于显示错误信息的,需要用到flash模块,在命令行中输入npm installconnect-flash来安装flash,然后在app.js中var settings后面加上var flash = require(connect-flash);在“app.set(view engine, ejs);”后添加:app.use(flash();这样就可以使用flash的通知功能了。还注意到什么没?crypto!crypto 是 Node.js 的一个核心模块,功能是加密并生成各种散列,使用它之前首先要声明 var crypto = require(crypto)。代码中使用它计算了密码的散列值。到这里,应该登录就写完了,试试?点击登录按钮没有任何提示?因为还没有加为了显示信息,还需要引入视图助手,node.js开发指南中这样描述:“为了实现不同登录状态下页面呈现不同内容的功能,我们需要创建动态视图助手,通过它我们才能在视图中访问会话中的用户数据。同时为了显示错误和成功的信息,也要在动态视图助手中增加响应的函数。 ”打开 app.js,在http.createServer()前添加以下代码:app.use(function(req,res,next)var err = req.flash(error), success = req.flash(success);res.locals.user = req.session.user;res.locals.error = err.length ? err : null;res.locals.success = success.length ? success : null;next(););在header.ejs的最后添加以下代码: 好了,再试试登录?因为这个时候的数据库是空的,所以用户名不存在。那接下来就通过注册添加新用户吧?毕竟mongodb的用法还不是很熟悉。修改index.js中的reg的get和post处理:app.get(/reg, function(req,res) res.render(reg, title:注册, user:req.session.user, success:req.flash(success).toString(), error:req.flash(error).toString() ); );app.post(/reg, function(req,res) if(req.bodypassword-repeat != req.bodypassword) req.flash(error,两次输入的口令不一致); return res.redirect(/reg); var md5 = crypto.createHash(md5); var password = md5.update(req.body.password).digest(base64); var newUser = new User( name: req.body.username, password: password, ); User.get(newU, function(err, user) if(user) err = 用户已存在; if(err) req.flash(error, err); return res.redirect(/reg); newUser.save(function(err) if(err) req.flash(error,err); return res.redirect(/reg); req.session.user = newUser; req.flash(success,注册成功); res.redirect(/); ); ););好了,重启app.js,可以注册了,注册之后登录看看?接下来,完善左边的导航部分,在header.ejs的nav后面添加:发表文章退出并在views下面增加发表文章的视图post.ejs:标题:内容:下面该写文章的模型了,文章对应的有评论,把评论也作为一个数据模型,直接上代码:post.jsvar mongodb = require(./db);function Post(user,title,tags,post) this.user = user;this.title = title;this.post = post;module.exports = Post;Ptotype.save = function(callback) var date = new Date();var time = date: date, year : date.getFullYear(), month : date.getFullYear() + - + (date.getMonth()+1), day : date.getFullYear() + - + (date.getMonth()+1) + - + date.getDate(), minute : date.getFullYear() + - + (date.getMonth()+1) + - + date.getDate() + + date.getHours() + : + date.getMinutes()var post = user: this.user,/用户 time: time,/发表时间 title: this.title,/标题 pv:0,/访问量 post: this.post,/文章内容 comments:/评论;mongodb.open(function (err, db) if (err) return callback(err); db.collection(posts, function (err, collection) if (err) mongodb.close(); return callback(err); collection.insert(post, safe: true , function (err,post) mongodb.close(); callback(err,post); ); ););Post.getAll = function(user, callback) /获取一个人的所有文章mongodb.open(function (err, db) if (err) return callback(err); db.collection(posts, function(err, collection) if (err) mongodb.close(); return callback(err); var query=; if(user)/因为index.js中app.get(/)为Post.getAll(null, function(err, posts),所以要判断user query.user=user; collection.find(query).sort( time: -1 ).toArray(function (err, docs) mongodb.close(); if (err) callback(err, null); callback(null, docs); ); ););Post.getTen = function(user, page, callback) /获取十篇文章(这个可以先不管,这是加分页的时候要用的)mongodb.open(function (err, db) if (err) return callback(err); db.collection(posts, function(err, collection) if (err) mongodb.close(); return callback(err); var query = ; if(user) query.user = user; collection.find(query,skip:(page-1)*5, limit:5).sort( time: -1 ).toArray(function (err, docs) mongodb.close(); if (err) callback(err, null); docs.forEach(function(doc) doc.post = markdown.toHTML(doc.post); ); callback(null, docs); ); ););Post.getOne = function(user, day, title, callback) /获取一篇文章mongodb.open(function (err, db) if (err) return callback(err); db.collection(posts, function(err, collection) if (err) mongodb.close(); return callback(err); collection.findOne(user:user,time.day:day,title:title,function (err, doc) mongodb.close(); if (err) callback(err, null); console.log(doc); doc.post = markdown.toHTML(doc.post); console.log(ments); ments.forEach(function(comment) console.log(comment); comment.content = markdown.toHTML(comment.content); ); callback(null, doc); cosole.log(ments); ); collection.update(user:user,time.day:day,title:title,$inc:pv:1); ););comment.jsvar mongodb = require(./db);function Comment(user, day, title, comment) this.user = user; this.day = day; this.title = title; ment = comment;module.exports = Comment;Ctotype.save = function(callback) var user = this.user, day = this.day, title = this.title, comment = ment;mongodb.open(function (err, db) if (err) return callback(err); db.collection(posts, function (err, collection) if (err) mongodb.close(); return callback(err); collection.findAndModify(user:user,time.day:day,title:title , time,-1 , $push:comments:comment , new: true , function (err,comment) mongodb.close(); callback(err,comment); ); ););然后在index.js中引入需要的文件,本例中的引用的文件如下:发表文章的响应: app.get(/post, function(req, res) res.render(post, title:Post, user:req.session.user, success:req.flash(success).toString(), error:req.flash(error).toString() ); ); app.post(/post, function(req, res)var currentUser = req.session.user, post = new Post(currentU, req.body.title, tags,req.body.post); post.save(function(err) if(err) req.flash(error, err); return res.redirect(/); req.flash(success, 发布成功!); res.redirect(/); ););好了,现在可以发表文章了。再做一个调整,主页默认显示所有文章,需要修改两个地方,一是index.ejs,还有一个是index.js中的app.get(/);index.

温馨提示

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

评论

0/150

提交评论