Skip to content

Commit 38af10d

Browse files
committedJun 26, 2012
added ability to connect to mongodb and leave comments, updated stylesheets
1 parent 3736aca commit 38af10d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+29460
-22
lines changed
 

‎app.js

+39-8
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,15 @@
1+
/**
2+
* Module dependencies.
3+
*/
4+
15
var express = require('express');
2-
var ArticleProvider = require('./articleprovider-memory').ArticleProvider;
6+
var ArticleProvider = require('./articleprovider-mongodb').ArticleProvider;
7+
38

49
var app = module.exports = express.createServer();
510

11+
// Configuration
12+
613
app.configure(function(){
714
app.set('views', __dirname + '/views');
815
app.set('view engine', 'jade');
@@ -14,20 +21,22 @@ app.configure(function(){
1421
});
1522

1623
app.configure('development', function(){
17-
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
24+
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
1825
});
1926

2027
app.configure('production', function(){
21-
app.use(express.errorHandler());
28+
app.use(express.errorHandler());
2229
});
2330

24-
var articleProvider= new ArticleProvider();
31+
var articleProvider = new ArticleProvider('localhost', 27017);
32+
// Routes
2533

2634
app.get('/', function(req, res){
2735
articleProvider.findAll( function(error,docs){
28-
res.render('index.jade', { locals: {
29-
title: 'a simple blog',
30-
articles:docs
36+
res.render('index.jade', {
37+
locals: {
38+
title: 'a simple blog',
39+
articles:docs
3140
}
3241
});
3342
})
@@ -49,4 +58,26 @@ app.post('/blog/new', function(req, res){
4958
});
5059
});
5160

52-
app.listen(3000);
61+
app.get('/blog/:id', function(req, res) {
62+
articleProvider.findById(req.params.id, function(error, article) {
63+
res.render('blog_show.jade',
64+
{ locals: {
65+
title: article.title,
66+
article: article
67+
}
68+
});
69+
});
70+
});
71+
72+
app.post('/blog/addComment', function(req, res) {
73+
articleProvider.addCommentToArticle(req.param('_id'), {
74+
person: req.param('person'),
75+
comment: req.param('comment'),
76+
created_at: new Date()
77+
} , function( error, docs) {
78+
res.redirect('/blog/' + req.param('_id'))
79+
});
80+
});
81+
82+
app.listen(3000);
83+
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);

‎articleprovider-mongodb.js

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
var Db = require('mongodb').Db;
2+
var Connection = require('mongodb').Connection;
3+
var Server = require('mongodb').Server;
4+
var BSON = require('mongodb').BSON;
5+
var ObjectID = require('mongodb').ObjectID;
6+
7+
ArticleProvider = function(host, port) {
8+
this.db= new Db('node-mongo-blog', new Server(host, port, {auto_reconnect: true}, {}));
9+
this.db.open(function(){});
10+
};
11+
12+
13+
ArticleProvider.prototype.getCollection= function(callback) {
14+
this.db.collection('articles', function(error, article_collection) {
15+
if( error ) callback(error);
16+
else callback(null, article_collection);
17+
});
18+
};
19+
20+
ArticleProvider.prototype.findAll = function(callback) {
21+
this.getCollection(function(error, article_collection) {
22+
if( error ) callback(error)
23+
else {
24+
article_collection.find().toArray(function(error, results) {
25+
if( error ) callback(error)
26+
else callback(null, results)
27+
});
28+
}
29+
});
30+
};
31+
32+
33+
ArticleProvider.prototype.findById = function(id, callback) {
34+
this.getCollection(function(error, article_collection) {
35+
if( error ) callback(error)
36+
else {
37+
article_collection.findOne({_id: article_collection.db.bson_serializer.ObjectID.createFromHexString(id)}, function(error, result) {
38+
if( error ) callback(error)
39+
else callback(null, result)
40+
});
41+
}
42+
});
43+
};
44+
45+
ArticleProvider.prototype.save = function(articles, callback) {
46+
this.getCollection(function(error, article_collection) {
47+
if( error ) callback(error)
48+
else {
49+
if( typeof(articles.length)=="undefined")
50+
articles = [articles];
51+
for( var i =0;i< articles.length;i++ ) {
52+
article = articles[i];
53+
article.created_at = new Date();
54+
if( article.comments === undefined ) article.comments = [];
55+
for(var j =0;j< article.comments.length; j++) {
56+
article.comments[j].created_at = new Date();
57+
}
58+
}
59+
60+
article_collection.insert(articles, function() {
61+
callback(null, articles);
62+
});
63+
}
64+
});
65+
};
66+
67+
ArticleProvider.prototype.addCommentToArticle = function(articleId, comment, callback) {
68+
this.getCollection(function(error, article_collection) {
69+
if( error ) callback( error );
70+
else {
71+
article_collection.update(
72+
{_id: article_collection.db.bson_serializer.ObjectID.createFromHexString(articleId)},
73+
{"$push": {comments: comment}},
74+
function(error, article){
75+
if( error ) callback(error);
76+
else callback(null, article)
77+
});
78+
}
79+
});
80+
};
81+
82+
exports.ArticleProvider = ArticleProvider;

0 commit comments

Comments
 (0)