1. 程式人生 > >Node.js筆記(七)讀取mongoDB的資料並顯示

Node.js筆記(七)讀取mongoDB的資料並顯示

雖然以前接觸了mysql的內容,但做網站的時候,感覺NoSQL資料庫還是繞不過去。
很多書籍上都提到了node.js和MongoDB的配合使用,這裡記錄一下學習過程。

MongoDB的基本命令:

use dbname  新建或者使用現有資料庫
show dbs 顯示所有資料庫
show collections 顯示所有collection(表)
db.collection.find() 打印表中資料

上述命令在mongo控制檯中使用,不能在node.js裡直接使用

我們想要把資料庫裡存放的文章列表取出來顯示到頁面上,離不開模板引擎,我分別使用了ejs和jade兩種引擎,用於比較
關於資料庫的管理,可以直接管理也可以使用monk提供的中介軟體,我會分別貼出來

/*
*app.js 不使用monk
*
*/
var express = require('express');
var path = require('path');
var jade = require('jade');
var fs = require('fs');
var mongodb = require("mongodb");
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// not use monk
var server = new mongodb.Server('localhost',27017,{auto_reconnect:true}); var db = new mongodb.Db("mysite",server,{safe:false}); //開啟資料庫連線 db.open(function(err,db){ if(err){ console.log(err); return false; } else console.log('connect!'); }); //連線到collection var
link = function(db){ return function(req,res){ db.collection('usercollection', {safe:true}, function(err, collection){ /*collection方法用於連線現有表,{safe:true} 選項,當collection不存在的時候報錯 createCollection方法用於建立新表,{safe:true} 選項,當collection存在的時候報錯 */ if(err){ console.log(err); } else{ console.log('get collection!'); collection.find().toArray(function(err,docs){ console.log('find'); res.render('userlist',{userlist:docs}); }); } }); } } app.get('/',link(db)); /*關於路由link方法的位置,合適的做法是放在routes/index檔案裡面,但方法裡的依賴項太多,所以還是塞到了一個檔案裡 */ var list = function(){console.log('hah');} var port = 8080; app.listen(port); console.log('Listening on port ' + port);
/*使用monk*/
var express = require('express');
var path = require('path');

var jade = require('jade');
var fs = require('fs');
var mongodb = require("mongodb");
var monk = require('monk');
var db = monk('localhost:27017/mysite');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

var userlist = function(db) {
    return function(req, res) {
        var collection = db.get('usercollection');
        collection.find({},{},function(e,docs){
            res.render('userlist', {
                "userlist" : docs
            });//使用頁面引擎渲染
        });
    };
};

app.get('/',userlist(db));

var list = function(){console.log('hah');}
var port = 8080;
app.listen(port);
console.log('Listening on port ' + port);

可以看出使用monk之後省去了open操作,程式碼長度也有縮短。

jade和ejs
需要把列表的資料顯示在頁面上,因此需要頁面引擎的渲染
下面是ejs和jade的程式碼:

/*jade 
對縮排控制嚴格,稍不注意就出錯
*/
extends layout
block content
    h1.
        User List
    ul
        each user, i in userlist
            li
                a(href="mailto:#{user.email}")= user.username
/*ejs
這段模板是在網上找得,還沒有試
*/

<html>  
<head>  
<title></title>  
<style type="text/css">  
   ul li { list-style: none; width: 200px; padding:5px; background: pink; margin-bottom: 5px;}  
</style>  
</head>  
<body>  
    <ul>  
        <% for(i=0; i< userlist.length; i++) {%>  
           <li><a><%= userlist[i].username %></a></li>  
        <% } %>  
[html] view plaincopyprint?
        </yk>  
</body>  
</html>

————————————————————————
關於nodejs文章的分類,想一想既不能算是前端,也不能算傳統的後端。
但nodejs的出現,對確實是熟悉javascript的前端工程師來說,確實是好訊息。因此將其分類為前端,雖有不妥之處,但也湊合。