-
-
Save ccoenraets/3819468 to your computer and use it in GitHub Desktop.
| var express = require('express'), | |
| wine = require('./routes/wines'); | |
| var app = express(); | |
| app.configure(function () { | |
| app.use(express.logger('dev')); /* 'default', 'short', 'tiny', 'dev' */ | |
| app.use(express.bodyParser()); | |
| }); | |
| app.get('/wines', wine.findAll); | |
| app.get('/wines/:id', wine.findById); | |
| app.post('/wines', wine.addWine); | |
| app.put('/wines/:id', wine.updateWine); | |
| app.delete('/wines/:id', wine.deleteWine); | |
| app.listen(3000); | |
| console.log('Listening on port 3000...'); |
| var mongo = require('mongodb'); | |
| var Server = mongo.Server, | |
| Db = mongo.Db, | |
| BSON = mongo.BSONPure; | |
| var server = new Server('localhost', 27017, {auto_reconnect: true}); | |
| db = new Db('winedb', server); | |
| db.open(function(err, db) { | |
| if(!err) { | |
| console.log("Connected to 'winedb' database"); | |
| db.collection('wines', {strict:true}, function(err, collection) { | |
| if (err) { | |
| console.log("The 'wines' collection doesn't exist. Creating it with sample data..."); | |
| populateDB(); | |
| } | |
| }); | |
| } | |
| }); | |
| exports.findById = function(req, res) { | |
| var id = req.params.id; | |
| console.log('Retrieving wine: ' + id); | |
| db.collection('wines', function(err, collection) { | |
| collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item) { | |
| res.send(item); | |
| }); | |
| }); | |
| }; | |
| exports.findAll = function(req, res) { | |
| db.collection('wines', function(err, collection) { | |
| collection.find().toArray(function(err, items) { | |
| res.send(items); | |
| }); | |
| }); | |
| }; | |
| exports.addWine = function(req, res) { | |
| var wine = req.body; | |
| console.log('Adding wine: ' + JSON.stringify(wine)); | |
| db.collection('wines', function(err, collection) { | |
| collection.insert(wine, {safe:true}, function(err, result) { | |
| if (err) { | |
| res.send({'error':'An error has occurred'}); | |
| } else { | |
| console.log('Success: ' + JSON.stringify(result[0])); | |
| res.send(result[0]); | |
| } | |
| }); | |
| }); | |
| } | |
| exports.updateWine = function(req, res) { | |
| var id = req.params.id; | |
| var wine = req.body; | |
| console.log('Updating wine: ' + id); | |
| console.log(JSON.stringify(wine)); | |
| db.collection('wines', function(err, collection) { | |
| collection.update({'_id':new BSON.ObjectID(id)}, wine, {safe:true}, function(err, result) { | |
| if (err) { | |
| console.log('Error updating wine: ' + err); | |
| res.send({'error':'An error has occurred'}); | |
| } else { | |
| console.log('' + result + ' document(s) updated'); | |
| res.send(wine); | |
| } | |
| }); | |
| }); | |
| } | |
| exports.deleteWine = function(req, res) { | |
| var id = req.params.id; | |
| console.log('Deleting wine: ' + id); | |
| db.collection('wines', function(err, collection) { | |
| collection.remove({'_id':new BSON.ObjectID(id)}, {safe:true}, function(err, result) { | |
| if (err) { | |
| res.send({'error':'An error has occurred - ' + err}); | |
| } else { | |
| console.log('' + result + ' document(s) deleted'); | |
| res.send(req.body); | |
| } | |
| }); | |
| }); | |
| } | |
| /*--------------------------------------------------------------------------------------------------------------------*/ | |
| // Populate database with sample data -- Only used once: the first time the application is started. | |
| // You'd typically not find this code in a real-life app, since the database would already exist. | |
| var populateDB = function() { | |
| var wines = [ | |
| { | |
| name: "CHATEAU DE SAINT COSME", | |
| year: "2009", | |
| grapes: "Grenache / Syrah", | |
| country: "France", | |
| region: "Southern Rhone", | |
| description: "The aromas of fruit and spice...", | |
| picture: "saint_cosme.jpg" | |
| }, | |
| { | |
| name: "LAN RIOJA CRIANZA", | |
| year: "2006", | |
| grapes: "Tempranillo", | |
| country: "Spain", | |
| region: "Rioja", | |
| description: "A resurgence of interest in boutique vineyards...", | |
| picture: "lan_rioja.jpg" | |
| }]; | |
| db.collection('wines', function(err, collection) { | |
| collection.insert(wines, {safe:true}, function(err, result) {}); | |
| }); | |
| }; |
Hey there,
It looks like mongo has changed a bit since this article, but this article has really helped me. Thank you for writing it.
When I run this, I keep running into the following error when inserting a new record:
[ryan@centos beard]$ curl -i -X POST -H 'Content-Type: application/json' -d '{"name": "test"}' http://localhost:8080/servers
HTTP/1.1 500 Internal Server Error
X-Powered-By: Express
Content-Type: text/html
Content-Length: 986
Date: Wed, 26 Mar 2014 17:35:50 GMT
Connection: keep-alive
TypeError: Cannot read property '_id' of undefined
at insertAll (/home/ryan/source/node/beard/node_modules/mongodb/lib/mongodb/collection/core.js:174:13)
at Collection.insert (/home/ryan/source/node/beard/node_modules/mongodb/lib/mongodb/collection/core.js:35:3)
at /home/ryan/source/node/beard/routes/servers.js:48:16
at Db.collection (/home/ryan/source/node/beard/node_modules/mongodb/lib/mongodb/db.js:495:44)
at exports.addServer (/home/ryan/source/node/beard/routes/servers.js:47:6)
at callbacks (/home/ryan/source/node/beard/node_modules/express/lib/router/index.js:164:37)
at param (/home/ryan/source/node/beard/node_modules/express/lib/router/index.js:138:11)
at pass (/home/ryan/source/node/beard/node_modules/express/lib/router/index.js:145:5)
at Router._dispatch (/home/ryan/source/node/beard/node_modules/express/lib/router/index.js:173:5)
Is this an issue with my database, or do I need to modify the code to reflect updates to mongo?
Thanks for your help!
Hi, Just forked this gist and modified it to use mongoose.