Skip to content

Instantly share code, notes, and snippets.

@tmpjr
Last active May 26, 2016 09:12
Show Gist options
  • Save tmpjr/539554d86b6ccc796462 to your computer and use it in GitHub Desktop.
Save tmpjr/539554d86b6ccc796462 to your computer and use it in GitHub Desktop.
Sample REST server with Node, Mongoose and Express
var express = require('express');
var bodyParser = require('body-parser');
var mongoose = require('mongoose');
var morgan = require('morgan');
var jwt = require('jsonwebtoken');
var app = express();
var router = express.Router();
var config = require('./config');
var Sample = require('./sample');
var User = require('./user');
mongoose.connect(config.database);
app.set('superSecret', config.secret);
app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
router.post('/authenticate', function(req, res) {
User.findOne({
name: req.body.name
}, function(err, user) {
if (err) throw err;
if (!user) {
res.json({ success: false, message: 'Authentication failed. User not found.' });
} else if (user) {
if (user.password != req.body.password) {
res.json({ success: false, message: 'Authentication failed. Wrong password.' });
} else {
// if user is found and password matches, create a token
var token = jwt.sign(user, app.get('superSecret'), {
expiresInMinutes: 1440 // 24 hours
});
res.json({
success: true,
message: 'Here is your token',
token: token
});
}
}
});
});
router.route('/users')
.post(function(req, res) {
var user = new User(req.body);
user.save(function(err) {
if (err) throw err;
console.log('User saved successfully');
res.send({ success: true });
});
})
.get(function(req, res) {
User.find(function(err, users) {
if (err) throw err;
res.json(users);
});
});
router.route('/samples')
.get(function(req, res) {
Sample.find(function(err, samples) {
if (err) {
res.send(err);
}
res.json(samples);
});
})
.post(function(req, res) {
var sample = new Sample(req.body);
sample.save(function(err) {
if (err) {
res.send(err);
}
res.send({message: 'Sample added'});
});
});
router.route('/samples/:id')
.put(function(req, res) {
Sample.findOne({ _id:req.params.id }, function(err, sample) {
if (err) {
res.send(err);
}
for (prop in req.body) {
sample[prop] = req.body[prop];
}
sample.save(function(err) {
if (err) {
res.send(err);
}
res.send(sample);
});
});
})
.get(function(req, res) {
Sample.findOne({ _id:req.params.id }, function(err, sample) {
if (err) {
res.send(err);
}
res.json(sample);
});
})
.delete(function(req, res) {
Sample.remove({
_id: req.params.id
}, function(err, sample) {
if (err) {
res.send(err);
}
res.json({ message: "Successfully deleted" })
});
});
app.use('/api', router);
app.set('port', 8000);
var server = app.listen(app.get('port'), function() {
console.log('Express server listening on port ' + server.address().port);
});
module.exports = {
'secret': 'carplanegoosehouse',
'database': 'mongodb://localhost:27017/sampledb'
};
{
"name": "sample-storage",
"version": "1.0.0",
"description": "",
"main": "api.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "@tmpjrdotme",
"license": "ISC",
"dependencies": {
"body-parser": "^1.13.3",
"express": "^4.13.3",
"jsonwebtoken": "^5.0.5",
"mongoose": "^4.1.3",
"morgan": "^1.6.1"
}
}
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var sampleSchema = new Schema({
barcode: String,
type: String,
collected: Date,
created_at: Date,
updated_at: Date
});
sampleSchema.pre('save', function(next) {
var currentDate = new Date();
this.updated_at = currentDate;
if (!this.created_at) {
this.created_at = currentDate;
}
next();
});
module.exports = mongoose.model('Sample', sampleSchema);
{
"accession": "Z2342343",
"barcode": "B324234",
"specimen_type": "Blood",
"received_on": "2015-08-12"
}
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var userSchema = new Schema({
name: String,
password: String,
admin: Boolean
});
module.exports = mongoose.model('User', userSchema);
@tmpjr
Copy link
Author

tmpjr commented Aug 28, 2015

Just a bare bones implementation of a REST API using Node, Express and Mongoose. I created this gist for reference.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment