做爲一個初學者,作這個例子的時候我也是遇到了不少問題,在查看了一些大牛的解答,終於實現了這個簡單的效果,下面我來分享這個源代碼,以及其中我所遇到的問題html
這是在nodejs環境下做的一個實例,用到了jade,express,mongodb這幾個主要的模塊node
layout.jade文件web
doctype 5
html
head
title Mongodb example
body
h1 my first mongodb app
hr
block contentmongodb
index.jade文件數據庫
extends ../layout
block content
if (authenticated)
p welcome back, #{me.first}
a(href="/logout") logout
else
p welcome new visitor
ul
li
a(href="/login") login
li
a(href="/signup") signupexpress
login.jade文件cookie
extends ../layout
block content
form(action="/login",method="POST")
fieldset
legend Log in
if(signupEmail)
p congratulations on signup!pleasel login below
p
label email
input(name="user[email]",type="text",value=signupEmail)
p
label password
input(name="user[password]",type="password")
p
button submit
p
a(href="/")go backsession
signup.jade文件app
extends ../layout
block content
form(action="/signup",method="POST")
fieldset
legend Sign up
p
label first
input(name="user[first]",type="text")
p
label last
input(name="user[last]",type="text")
p
label email
input(name="user[email]",type="text")
p
label password
input(name="user[password]",type="password")
p
button submit
p
a(href="/") go backpost
server.js文件
var express = require('express');
var app = express.createServer();
var ObjectId = require('mongodb').ObjectID;
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({secret:'my secret'}));
app.use(function(req,res,next){//這個中間件必定要放在前面,放到定義的路由後面就沒起做用了,這是身份驗證中間件,特別注意匹配數據庫_id時要先把獲得的id字符串轉換爲ObjectId對象ObjectId(req.session.loggedIn)
if(req.session.loggedIn)
{
//console.log(1);
res.local('authenticated',true);
app.users.findOne({_id:ObjectId(req.session.loggedIn)},function(err,doc){
if(err) return next(err);
// console.log(doc);
res.local('me',doc);
next();
})
}else
{
res.local('authenticated',false);
res.local('signupEmail',false);
next();
}
})
app.set('views','./views/pages');
app.set('view engine','jade');
app.set('view options',{layout:false});
app.get('/',function(req,res){//定義首頁路由
res.render('index'/*,{authenticated:false}*/);
})
app.get('/login',function(req,res){//定義登陸頁面路由
res.render('login');
})
app.get('/login/:id',function(req,res){//登陸路由,應用於剛註冊後
res.render('login',{signupEmail:req.params.id});
})
app.post('/login',function(req,res){//處理登陸路由
app.users.findOne({email:req.body.user.email,password:req.body.user.password},function(err,doc){
if(err) return next(err);
if(!doc) return res.end('user not find ,go back and try again');
//console.log(doc);
req.session.loggedIn = doc._id.toString();
//console.log(req.session.loggedIn);
res.redirect('/');
})
})
app.get('/logout',function(req,res){//登出出來
req.session.loggedIn = null;
res.redirect('/');
})
app.get('/signup',function(req,res,next){//註冊路由
res.render('signup')
})
app.post('/signup',function(req,res,next){//處理註冊路由
app.users.insert(req.body.user,function(err,doc){
//console.log(req.body.user)
//console.log(doc);
/*doc的內容{ result: { ok: 1, n: 1 },
ops:
[ { first: '66',
last: '77',
email: '88',
password: '99',
_id: 58d1248a72b183070d1cf678 } ],
insertedCount: 1,
insertedIds: [ 58d1248a72b183070d1cf678 ] }
*/
if(err) return next(err);
res.redirect('/login/'+doc.ops[0].email);
})
})
var mongodb = require('mongodb').Db;
var server = require('mongodb').Server;
var db = new mongodb('my-website',new server('127.0.0.1',27017));//鏈接數據庫
db.open(function(err,client){
if(err) throw err;
console.log('connected to mongodb');
app.users = db.collection('users');//建立一個集合名爲users
client.ensureIndex('users','email',function(err){
if(err) throw err;
client.ensureIndex('users','password',function(err){
if(err) throw err;
console.log('ensured index');
app.listen(3000,function(){
console.log('app listening on 3000');
})
})
})
})
//app.listen(3000);
本身須要安裝mongodb和nodejs,這個到相應的官網很容易下到的!