Node.js

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" : "cwbuecheler@nospam.com"
}

在控制台输入:

db.usercollection.insert({ "username" : "testuser1", "email" : "testuser1@testdomain.com" })

认为“db”代表我们的数据库,其中如上文所述,我们已经定义为“nodetest1”。

下面输入:

db.usercollection.find().pretty()

“usercollection”部分是我们的集合。请注意,这里我们没有创建了“usercollection”集合。因为我们第一次添加它时,它会被自动创建。上面命令返回:

{
"_id" : ObjectId("5202b481d2184d390cbf6eca"),
"username" : "testuser1",
"email" : "testuser1@testdomain.com"
}

ObjectId是MongoDB自动产生的。现在我们有了一个记录,可以增加更多:

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

输出结果:

{
        "_id" : ObjectId("5202b481d2184d390cbf6eca"),
        "username" : "testuser1",
        "email" : "testuser1@testdomain.com"
}
{
        "_id" : ObjectId("5202b49ad2184d390cbf6ecb"),
        "username" : "testuser2",
        "email" : "testuser2@testdomain.com"
}
{
        "_id" : ObjectId("5202b49ad2184d390cbf6ecc"),
        "username" : "testuser3",
        "email" : "testuser3@testdomain.com"
}

STEP 5 – HOOK MONGO连接到 NODE

我们将输出如下结果:

<ul>
    <li><a href="mailto:testuser1@testdomain.com">testuser1</a></li>
    <li><a href="mailto:testuser2@testdomain.com">testuser2</a></li>
    <li><a href="mailto:testuser3@testdomain.com">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