Node.js Express 從入門到菜鳥(三)——node.js+express+mongodb 操作資料庫

來源:互聯網
上載者:User

    過了個五一,回來又開始搞這個系列。

    看完之前的系列,咱們已經可以完成一個簡單的不需要資料庫的網站了。當然,不連資料庫的網站挺少的,咱們接下來就講一下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);}

   這是項目的結構

   

        祝大家玩的愉快~~~~

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.