Node.js操作mongodb資料庫

來源:互聯網
上載者:User

 1、開始運用mongoose時,得先安裝,開啟命令列,執行$ npm install mongoose

2、串連mongodb資料庫,在app.js裡面添加如下兩行代碼。


[javascript]
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test'); //串連到一個test的資料庫 

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test'); //串連到一個test的資料庫操作到這裡基本上是個人都會,不過接下來具體如何進行資料庫的操作,在沒有執行個體的情況下還是有點糾結的。我這裡以一個登入註冊為例來說明如何使用。

3、用webstorm建立一個新的Express App項目,這樣就直接封裝好了express(),省去了自己寫的麻煩。然後修改app.js如下:


[javascript]
/**
 * Module dependencies.
 */ 
 
var express = require('express') 
  , routes = require('./routes') 
  , user = require('./routes/user') 
  , http = require('http') 
  , path = require('path') 
  , mongoose = require('mongoose');   //1  
 
 
var app = express(); 
 
 
// all environments  
app.set('port', process.env.PORT || 3000); 
app.set('views', __dirname + '/views'); 
app.set('view engine', 'ejs'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 
app.use(app.router); 
app.use(express.static(path.join(__dirname, 'public'))); 
 
 
// development only  
if ('development' == app.get('env')) { 
  app.use(express.errorHandler()); 

 
 
app.get('/', routes.index); 
app.get('/log',routes.login); 
app.post('/log',routes.doLogin); 
app.get('/reg',routes.reg); 
app.post('/reg',routes.doReg); 
 
 
//mongoose  
mongoose.connect('mongodb://localhost/test_db');  //2 
 
 
http.createServer(app).listen(app.get('port'), function(){ 
  console.log('Express server listening on port ' + app.get('port')); 
}); 

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , mongoose = require('mongoose');   //1


var app = express();


// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));


// development only
if ('development' == app.get('env')) {
  app.use(express.errorHandler());
}


app.get('/', routes.index);
app.get('/log',routes.login);
app.post('/log',routes.doLogin);
app.get('/reg',routes.reg);
app.post('/reg',routes.doReg);


//mongoose
mongoose.connect('mongodb://localhost/test_db');  //2


http.createServer(app).listen(app.get('port'), function(){
  console.log('Express server listening on port ' + app.get('port'));
});

4、接下來定義一下Schema和Model,這些就是資料庫表的結構。在項目根路徑下建立一個models的檔案夾,裡面添加一個user.js用來定義使用者表。models/user.js代碼如下。


[javascript]
var mongoose = require('mongoose') 
    , Schema = mongoose.Schema 
    , ObjectId = Schema.ObjectId; 
 
var UserSchema = new Schema({ 
      name: String 
    , password: String 
}); 
 
module.exports = mongoose.model('User', UserSchema); 

var mongoose = require('mongoose')
    , Schema = mongoose.Schema
    , ObjectId = Schema.ObjectId;

var UserSchema = new Schema({
      name: String
    , password: String
});

module.exports = mongoose.model('User', UserSchema);注意最後一行,這裡是直接把UserSchema的Model給匯出去了,也可以直接匯出UserSchema,module.exports = UserSchema,不過這樣做的話,再用這個表資訊的時候就得單獨Model一下。

 

5、引入mongoose後,自己添加相應的檔案,在view裡建立登入註冊頁,頭部底部這些包含檔案也都自己建。先說註冊頁,表單處理路徑為/reg。注意使用者名稱密碼的輸入框我是直接用name="user[]"這種形式,這樣後面可以直接通過這個user來擷取相關資訊,其實不這樣也可以。
[javascript]
<% include header.ejs %> 
<form action="/reg" method="post"> 
<input type="text" name="user[name]" /> 
<input type="password" name="user[password]" /> 
<input type="submit" value="Register" /> 
</form> 
<% include footer.ejs %> 

<% include header.ejs %>
<form action="/reg" method="post">
<input type="text" name="user[name]" />
<input type="password" name="user[password]" />
<input type="submit" value="Register" />
</form>
<% include footer.ejs %>接下來修改doReg方法,這是處理註冊事件的函數。
6、修改index.js,因為想在這裡註冊時候把資料存入到資料庫中,所以這裡需要引用上面第四步建立的model。具體代碼如下所示。


[javascript]
var User = require('../models/user'); 
/*
 * GET home page.
 */ 
 
 
exports.index = function(req, res){ 
  User.find({}, function (err,users) { 
      res.render('index', { title: 'Express',users:users }); 
  }); 
}; 
 
exports.reg=function(req,res){ 
    res.render('reg',{title:'Register Page'}); 
}; 
exports.doReg=function(req,res){ 
    var user = new User(req.body.user); 
    user.save(function (err, user) { 
        if(!err) { 
            console.log(user); 
            res.redirect('/') 
        } 
    }); 
    console.log(req.body.user); 
}; 

var User = require('../models/user');
/*
 * GET home page.
 */


exports.index = function(req, res){
  User.find({}, function (err,users) {
      res.render('index', { title: 'Express',users:users });
  });
};

exports.reg=function(req,res){
    res.render('reg',{title:'Register Page'});
};
exports.doReg=function(req,res){
    var user = new User(req.body.user);
    user.save(function (err, user) {
        if(!err) {
            console.log(user);
            res.redirect('/')
        }
    });
    console.log(req.body.user);
};這一步要注意為什麼是req.body.user,這裡就是前面寫頁面直接用user[]這種形式帶來的好處,如果單獨寫name="username",那麼這裡就應該是下面這種形式。
[javascript]
var user = new User({ 
    name:req.body['username'], 
    password:req.body['password'] 
}); 

var user = new User({
 name:req.body['username'],
 password:req.body['password']
});user.save就是把剛才資料提交到資料庫,具體使用方法參看官方文檔。save成功之後執行什麼操作就自己發揮吧。儲存之前也可以進行一些簡單的表單驗證等等。

7、通過登入來講如何從資料庫取出資料,繼續修改index.js,如下所示。


[javascript]
var User = require('../models/user'); 
/*
 * GET home page.
 */ 
 
exports.index = function(req, res){ 
  User.find({}, function (err,users) { 
      res.render('index', { title: 'Express',users:users }); 
  }); 
}; 
exports.login=function(req,res){ 
    res.render('log',{title:'Login Page'}); 
} ; 
exports.doLogin=function(req,res){ 
    var user = req.body.user; 
    User.find(user,function(err,docs){ 
        if(!err){ 
            if(docs!=''){ 
                console.log(docs);                 
                return res.redirect('/'); 
            } else{ 
                console.log('使用者名稱或密碼不正確'); 
                return res.redirect('/log'); 
            } 
 
        }else{ 
            console.log("Something happend."); 
        } 
    }) 
}; 
exports.reg=function(req,res){ 
    res.render('reg',{title:'Register Page'}); 
}; 
exports.doReg=function(req,res){ 
    var user = new User(req.body.user); 
    user.save(function (err, user) { 
        if(!err) { 
            console.log(user); 
            res.redirect('/') 
        } 
    }); 
    console.log(req.body.user); 
}; 

var User = require('../models/user');
/*
 * GET home page.
 */

exports.index = function(req, res){
  User.find({}, function (err,users) {
      res.render('index', { title: 'Express',users:users });
  });
};
exports.login=function(req,res){
    res.render('log',{title:'Login Page'});
} ;
exports.doLogin=function(req,res){
    var user = req.body.user;
    User.find(user,function(err,docs){
        if(!err){
            if(docs!=''){
                console.log(docs);               
                return res.redirect('/');
            } else{
                console.log('使用者名稱或密碼不正確');
                return res.redirect('/log');
            }

        }else{
            console.log("Something happend.");
        }
    })
};
exports.reg=function(req,res){
    res.render('reg',{title:'Register Page'});
};
exports.doReg=function(req,res){
    var user = new User(req.body.user);
    user.save(function (err, user) {
        if(!err) {
            console.log(user);
            res.redirect('/')
        }
    });
    console.log(req.body.user);
};
這裡通過find()方法來查詢資料庫,使用方法不解釋了。第一個參數user就是要查詢的資料,從輸入框擷取過來的,如果不是用user[]這種形式定義的name屬性,那麼這裡一樣的用{naem:req.body['username'],password:req.body['password']}這樣的寫法。回呼函數docs就是從資料庫查詢返回的結果。

 

例子到此結束。


 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.