Node.js + Express + MongoDB教程


安裝:

STEP 1 – INSTALL NODE.JS

下載 Node.js website ,假設安裝在c:\node

STEP 2 – INSTALL EXPRESS

C:\node>npm install -g express

在NodeJs命令行輸入上述命令

STEP 3 – 創建一個EXPRESS PROJECT

使用Jade作爲模板,輸入:

C:\node>express --sessions nodetest1

輸出:

C:\node>express --sessions nodetest1
create : nodetest1
create : nodetest1/package.json
create : nodetest1/app.js
create : nodetest1/routes
create : nodetest1/routes/index.js
create : nodetest1/routes/user.js
create : nodetest1/views
create : nodetest1/views/layout.jade
create : nodetest1/views/index.jade
create : nodetest1/public/images
create : nodetest1/public/javascripts
create : nodetest1/public
create : nodetest1/public/stylesheets
create : nodetest1/public/stylesheets/style.css

install dependencies:
$ cd nodetest1 && npm install

run the app:
$ node app

STEP 4 – 編輯 依賴

express已經在nodetest1 創建一個文件package.json,打開編輯:

{
    "name": "application-name",
    "version": "0.0.1",
    "private": true,
    "scripts": {
        "start": "node app.js"
    },
    "dependencies": {
        "express": "3.4.4",
        "jade": "*"
    }
}

改變依賴,加入MongoDB 和 Monk.調用:

"dependencies": {
    "express": "3.4.4",
    "jade": "*",
    "mongodb": "*",
    "monk": "*"
}

STEP 5 – 安裝依賴

C:\node\nodetest1>npm install

現在你已經有了完整的準備,切換到nodetest1 輸入:

C:\node\nodetest1>node app.js

輸出:

Express server listening on port 3000

瀏覽器打開http://localhost:3000

界面如下:

 

 

實現Hello World

使用 Sublime Text來編輯代碼。

在nodetest1 打開 app.js. 加入如下:

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

這就產生了一堆基本的JavaScript變量,並將其綁到某些包,依賴關係,節點功能和路由。路由是有點像的模型和控制器在此設置的組合 - 他們指揮交通,也??包含一些編程邏輯。

開始編程,輸入:

var app = express();
這其中很重要的。它實例化Express,並分配我們的應用程序變量給它。下一節將使用這個變量來配置一堆的東西。

// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
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')));

這是告訴express哪裏發現視圖view,什麼引擎用來渲染這些視圖(jade),然後調用這些方法。

最後一行是告訴express服務靜態對象:/public/ dir,但使他們實際上看起來他們是從頂層到來。例如,圖像目錄爲c:\node\nodetest1\public\image,訪問是http://localhost:3000/images

你需要改變:

  app.use(express.bodyParser());

到:

    app.use(express.urlencoded());

這是爲了避免你的節點控制檯出現一些警告/。

下面是做一些錯誤檢查:

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

下面是告訴路由使用哪個URI:

app.get('/', routes.index);
app.get('/users', user.list);

代碼科技user變量映射到/routes/user.js?

 

下面是創建啓動服務器:

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

 

下面我們開始顯示Hello, World!,在app.js尾端加入:

  app.get('/helloworld', routes.helloworld);

如果你這時重啓服務器,瀏覽訪問http://localhost:3000/helloworld 會出錯,因爲我們沒有配置路由對應的頁面。

我們打開C:\NODE\NODETEST1\ROUTES\INDEX.JS,如下:

/*
* GET home page.
*/

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

我們要在/views下創建helloworld ,在該文件尾端加入:

exports.helloworld = function(req, res){
res.render('helloworld', { title: 'Hello, World!' });
};

當然我們不必要編輯具體helloworld頁面,因爲jade模板爲我們實現,打開views 目錄,打開index.jade. 文件,另存成:helloworld.jade

編輯C:\NODE\NODETEST1\VIEWS\HELLOWORLD.JADE

extends layout

block content
  h1= title
  p Welcome to #{title}

使用 ("extends") 繼承Jade的模板layout,定義了一個content 塊:title是我們在index.js路由中定義的,改變爲下面一行:

p Hello, World! Welcome to #{title}
保存後重啓啓動node.js,用ctrl-c中斷,再輸入
node app.js

輸入http://localhost:3000/helloworld 輸出 :

 

創建從數據庫讀取功能

STEP 1 – 安裝 MONGODB

http://mongodb.org/下載

STEP 2 – 運行 MONGOD 和 MONGO

在nodetest1 創建一個data目錄,進入mongoDB安裝目錄假設 C:\mongodb,執行:

mongod --dbpath c:\node\nodetest1\data

Mongo 已經啓動。

再次在該目錄執行:

mongo

輸出:

c:\mongo>mongo
MongoDB shell version: 2.4.5
connecting to: test

你會看到它提到已經建立一個連接。好吧,你已經得到了MongoDB的啓動和運行,你已經連接到它的客戶端。我們將使用這個客戶端手動操作數據庫,

STEP 3 – 創建 A DATABASE

在mongoDB控制檯輸入:

use nodetest1
這樣我們創建了nodetest1,

STEP 4 – 加入數據

MongoDB是使用JSON,我們這是一個用戶名和電子郵件地址的簡單的數據庫,數據看來如下:

{
"_id" : 1234,
"username" : "cwbuecheler",
"email" : "[email protected]"
}

在控制檯輸入:

db.usercollection.insert({ "username" : "testuser1", "email" : "[email protected]" })

認爲“db”代表我們的數據庫,其中如上文所述,我們已經定義爲“nodetest1”。

下面輸入:

db.usercollection.find().pretty()

“usercollection”部分是我們的集合。請注意,這裏我們沒有創建了“usercollection”集合。因爲我們第一次添加它時,它會被自動創建。上面命令返回:

{
"_id" : ObjectId("5202b481d2184d390cbf6eca"),
"username" : "testuser1",
"email" : "[email protected]"
}

ObjectId是MongoDB自動產生的。現在我們有了一個記錄,可以增加更多:

newstuff = [{ "username" : "testuser2", "email" : "[email protected]" }, { "username" : "testuser3", "email" : "[email protected]" }]
db.usercollection.insert(newstuff);

輸出結果:

{
        "_id" : ObjectId("5202b481d2184d390cbf6eca"),
        "username" : "testuser1",
        "email" : "[email protected]"
}
{
        "_id" : ObjectId("5202b49ad2184d390cbf6ecb"),
        "username" : "testuser2",
        "email" : "[email protected]"
}
{
        "_id" : ObjectId("5202b49ad2184d390cbf6ecc"),
        "username" : "testuser3",
        "email" : "[email protected]"
}

STEP 5 – HOOK MONGO連接到 NODE

我們將輸出如下結果:

<ul>
    <li><a href="mailto:[email protected]">testuser1</a></li>
    <li><a href="mailto:[email protected]">testuser2</a></li>
    <li><a href="mailto:[email protected]">testuser3</a></li>
</ul>

打開C:\node\nodetest1\app.js  頭部如下:

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

加入三行:

 

// New Code
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/nodetest1');

使用Monk 實現nodejs和mongo交互。mongoDB在localhost:27017/nodetest1,是我們之前創建的數據庫。

再加入下面幾行:

app.get('/', routes.index);
app.get('/users', user.list);
app.get('/helloworld', routes.helloworld);

最後加入下面一行:

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

當用戶瀏覽/userlist,我們將我們的數據庫對象db傳入userlist 路由,但是我們還沒有userlist 路由,下面我們來創建:

STEP 6 – 從MONGO拉出數據顯示

打開C:\node\nodetest1\routes\index.js ,加入:

exports.userlist = function(db) {
    return function(req, res) {
        var collection = db.get('usercollection');
        collection.find({},{},function(e,docs){
            res.render('userlist', {
                "userlist" : docs
            });
        });
    };
};

這是越來越相當複雜不過,這是一個包裝函數,參數是數據庫變量db,然後做一個頁面呈現,我們要使用('usercollection')做一個查詢,然後返回變量“文檔”結果,再做一個渲染的userlist(需要Jade模板)。

設置Jade模板,進入C:\node\nodetest1\views\ ,打開index.jade.轉存爲userlist.jade,打開編輯:

extends layout

block content
    h1.
        User List
    ul
        each user, i in userlist
            li
                a(href="mailto:#{user.email}")= user.username

這是顯示我們一開始需要的輸出列表結果。

重啓nodejs,瀏覽器進入 http://localhost:3000/userlist,輸出:

 

 

寫入數據庫

寫入數據庫並不是特別困難。從本質上講,我們需要設置一個路由,需要一個POST,而不是GET。

STEP 1 – 創建數據輸入

打開app.js,找到 app.get(); 

app.get('/newuser', routes.newuser);

在其後面加入:

app.get('/', routes.index);
app.get('/users', user.list);
app.get('/helloworld', routes.helloworld);
app.get('/userlist', routes.userlist(db));

// New Code
app.get('/newuser', routes.newuser);

打開 /routes/index.js增加路由

exports.newuser = function(req, res){
res.render('newuser', { title: 'Add New User' });
};

設置頁面,通過jade模板,打開 /views/index.jade,,另存爲newuser.jade,用下面內容完全替代:

extends layout

block content
    h1= title
    form#formAddUser(name="adduser",method="post",action="/adduser")
        input#inputUserName(type="text", placeholder="username", name="username")
        input#inputUserEmail(type="text", placeholder="useremail", name="useremail")
        button#btnSubmit(type="submit") submit

瀏覽器瀏覽http://localhost:3000/newuser

STEP 2 – 創建 DB功能

打開app.js,再次找到app.get,在後面加入:

app.get('/', routes.index);
app.get('/users', user.list);
app.get('/helloworld', routes.helloworld);
app.get('/userlist', routes.userlist(db));
app.get('/newuser', routes.newuser);

加入:

app.post('/adduser', routes.adduser(db));

打開/routes/index.js,加入:

exports.adduser = function(db) {
    return function(req, res) {

        // Get our form values. These rely on the "name" attributes
        var userName = req.body.username;
        var userEmail = req.body.useremail;

        // Set our collection
        var collection = db.get('usercollection');

        // Submit to the DB
        collection.insert({
            "username" : userName,
            "email" : userEmail
        }, function (err, doc) {
            if (err) {
                // If it failed, return error
                res.send("There was a problem adding the information to the database.");
            }
            else {
                // If it worked, set the header so the address bar doesn't still say /adduser
                res.location("userlist");
                // And forward to success page
                res.redirect("userlist");
            }
        });

    }
}

在成功添加到數據庫中,我們的用戶轉發回的userlist頁面,在那裏他們將看到他們的新添加的用戶。

STEP 4 – 連接數據庫增加數據

重新啓動nodejs,瀏覽http://localhost:3000/newuser 輸入數據

得到頁面:

 

大功告成。

完整源碼在github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章