Skip to content

Instantly share code, notes, and snippets.

@soareschen
Created April 9, 2014 00:46
Show Gist options
  • Save soareschen/10214286 to your computer and use it in GitHub Desktop.
Save soareschen/10214286 to your computer and use it in GitHub Desktop.
Benchmark
'use strict'
var Nedb = require('nedb')
var urlLib = require('url')
var httpLib = require('http')
var express = require('express')
var MongoClient = require('mongodb').MongoClient
var useExpress = true
var useMongo = true
var useImmediate = true
var defaultGreet = 'Hello'
var serverPort = 8080
var mockUserEntries = [
{
'user_id': 'john',
'name': 'John Smith',
'greet': 'bonjour'
},
{
'user_id': 'joker',
'name': 'Mr Joker',
'want_uppercase_greet': true
},
{
'user_id': 'troll',
'name': 'Anonymous Troll',
'is_banned': true
},
{
'user_id': 'admin',
'name': 'Administrator',
'is_admin': true
}
]
var createMockDatabase = function(callback) {
console.log('creating mock database')
var db = new Nedb()
db.insert(mockUserEntries, function(err) {
if(err) return callback(err)
callback(null, db)
})
}
var createMongoDatabase = function(callback) {
console.log('connecting to MongoDB')
MongoClient.connect('mongodb://127.0.0.1:27017/test', function(err, db) {
if(err) return callback(err)
var collection = db.collection('users')
callback(null, collection)
})
}
var endResponse = function(statusCode, response) {
response.writeHead(statusCode)
response.end()
}
var nodeStreamToText = function(readStream, callback) {
var stringBuffer = ''
var streamEnded = false
readStream.on('data', function(data) {
stringBuffer += data
})
readStream.on('end', function() {
if(streamEnded) return
streamEnded = true
callback(null, stringBuffer)
})
readStream.on('error', function(err) {
if(streamEnded) return
streamEnded = true
callback(err)
})
}
var tagsToReplace = {
'&': '&',
'<': '&lt;',
'>': '&gt;'
}
function replaceTag(tag) {
return tagsToReplace[tag] || tag;
}
function htmlEscape(str) {
return str.replace(/[&<>]/g, replaceTag);
}
var startExpressServer = function(handler) {
var app = express()
app.post('/:uid', handler)
app.listen(serverPort)
console.log('Express listening to port ' + serverPort + '...')
}
var startNodeServer = function(handler) {
var server = httpLib.createServer(handler)
server.listen(serverPort)
console.log('Node listening to port ' + serverPort + '...')
}
var createDatabase = useMongo ? createMongoDatabase : createMockDatabase
var doStartServver = useExpress ? startExpressServer : startNodeServer
var startServer = function(handler) {
if(!useImmediate) return doStartServver(handler)
console.log('using setImmediate')
var newHandler = function(request, response) {
setImmediate(function() {
handler(request, response)
})
}
doStartServver(newHandler)
}
createDatabase(function(err, db) {
if(err) throw err
var handler = function(request, response) {
var userId = useExpress ? request.params.uid : urlLib.parse(
request.url, true).pathname.slice(1)
db.findOne({ user_id: userId }, function(err, user) {
if(err) return callback(err)
if(!user) return endResponse(404, response)
if(user.is_banned) return endResponse(403, response)
nodeStreamToText(request, function(err, inputText) {
if(err) return endResponse(500, response)
if(!user.is_admin) inputText = htmlEscape(inputText)
var greet = user.greet || defaultGreet
var greeting = greet + ', <b>' + user.name + '</b>!\n' +
'You have submitted the following text: \n' + inputText
if(user.want_uppercase_greet) greeting = greeting.toUpperCase()
response.writeHead(200)
response.write(greeting)
response.end()
})
})
}
startServer(handler)
})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment