過了個五一,回來又開始搞這個系列。
看完之前的系列,咱們已經可以完成一個簡單的不需要資料庫的網站了。當然,不連資料庫的網站挺少的,咱們接下來就講一下node.js與mongodb的結合
在開始之前,假設咱們已經安裝並掌握了mongodb的安裝與簡單使用以及簡單的node.js操作mongodb。如果沒有的話,請移步《mongodb權威指南》或Node.js與MongoDB實戰教程
本篇部落格不講簡單的node.js操作資料庫的crud,咱們講的是node.js與mongodb的結合。如果對這句話有疑問的話,試著做一個簡單的登入網站就明白了。習慣了asp.net物件導向編程的我在最初接觸js的函數式非同步編程模式時,真是吃盡了苦頭。
我所理解的函數式非同步編程,是一種符合人的思維習慣的編程方式。簡單的說,就是完成操作A後根據我傳入的函數再去完成操作B。話不多說,看例子。
這是一個有登入,註冊,修改密碼功能的小例子。技術點有mongodb,session
按照之前講過的方法,安裝express
修改app.js檔案如下
app.js
根目錄下添加setting.js檔案如下
settings.js
1 module.exports = {2 cookieSecret: 'microblogbyvoid',3 db: 'mydb',4 host: 'localhost',5 port:'27017'6 };
在route目錄下添加logon.js檔案如下
logon.js
var user=require('../modules/user');exports.index = function(req, res){ res.render('logon/index',{title:'Logon'});};exports.logon = function(req, res){ var userService=new user({username:req.body.username,password:req.body.pwd}); userService.logon(function(err,doc){ if(err) { res.send('db error'+err); } if(doc) { req.session.userInfo=doc; res.send('ok'); } else { res.send('false'); } });};exports.register = function(req, res){ res.render('logon/register', { title: '註冊新使用者' });};exports.processRegister = function(req, res){ var userService=new user({username:req.body.username,password:req.body.pwd}); userService.get(function(err,result){ if(err) { res.send('db error'+err); } if(result) { res.send('使用者名稱已存在'); } else { userService.add(function(err,result){ if(err) { res.send('db error'+err); } if(result) { res.send('ok'); } else { res.send('添加失敗,請重試'); } }); } });};exports.changePwd = function(req, res){ res.render('logon/changePwd', { title: '修改密碼',username:req.session.userInfo.username });};exports.processChangePwd = function(req, res){ var userSevice=new user({username:req.session.userInfo.username,password:req.body.currPwd}); userSevice.get(function(err,doc){ if(err) { res.send('db error'+err); } if(doc) { userSevice.updatePwd(req.body.newpwd,function(err,doc){ if(err) { res.send('db error'+err); } if(doc) { res.send('ok'); } else { res.send('修改失敗'); } }); } else { res.send(doc); } })};
添加module檔案夾,在該檔案夾下添加db.js及user.js檔案如下
db.js
1 var settings = require('../setting');2 var Db = require('mongodb').Db;3 var Connection = require('mongodb').Connection;4 var Server = require('mongodb').Server;5 6 module.exports = new Db(settings.db, new Server(settings.host, settings.port, {auto_reconnect:true}),{safe:true});
user.js
var db=require('./db');function user(newUser){ this.username=newUser.username; this.password=newUser.password;};module.exports=user;user.prototype.get=function(callback){ var userTemp=new user({username:this.username,password:this.password}); db.open(function(err,db){ if(err) { db.close(); callback(err); } else { db.collection('users',function(err,collection){ if(err) { db.close(); callback(err); } else { var msg={username:userTemp.username}; collection.findOne(msg,function(err,doc){ db.close(); if(doc) { var userTemp=new user({username:doc.username,password:doc.password}); callback(err,userTemp); } else { callback(err,null); } }) } }); } });}user.prototype.add=function(callback){ var userTemp=new user({username:this.username,password:this.password}); db.open(function(err,db){ if(err) { db.close(); callback(err); } else { var msg={ username:userTemp.username,password:userTemp.password }; db.collection('users',function(err,collection){ collection.insert(msg,{safe:true},function(err,result){ db.close(); callback(err,result); }); }); } });}user.prototype.logon=function(callback){ var userTemp=new user({username:this.username,password:this.password}); db.open(function(err,db){ if(err) { db.close(); callback(err); } else { db.collection('users',function(err,collection){ if(err) { db.close(); callback(err); } else { var msg={username:userTemp.username,password:userTemp.password}; //不知道為什麼,加了{safe:true}這個選項後,只返回id collection.findOne(msg,function(err,doc){ db.close(); if(err) { callback(err) } else { callback(err,doc); } }); } }); } });}user.prototype.update=function(msg,updatamsg,callback){ db.open(function(err,db){ if(err) { db.close(); return callback(err); } db.collection('users',function(err,collection){ if(err) { db.close(); return callback(err); } collection.update(msg,updatamsg,function(err,doc){ db.close(); callback(err,doc); }) }) })}user.prototype.updatePwd=function(newPwd,callback){ var userTemp=new user({username:this.username,password:this.password}); var msg={"username":userTemp.username} var updatamsg={"$set":{"password":newPwd}}; userTemp.update(msg,updatamsg,callback);}
這是項目的結構
祝大家玩的愉快~~~~