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
界面如下:
实现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
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