guesser
Version:
a guessing game that learns
109 lines (90 loc) • 3.45 kB
JavaScript
#!/usr/bin/env nodejs
////////////////////////////////////////////////////////////////////////////////
/// Libraries and database driver
////////////////////////////////////////////////////////////////////////////////
var fs = require("fs");
var Promise = require("promise");
var concat = require("concat-stream");
var server_addr = process.env.ARANGODB_SERVER ? process.env.ARANGODB_SERVER : "http://localhost:8529";
var ignore = console.log("Using DB-Server " + server_addr);
var Database = require("arangojs");
if (server_addr !== "none") {
var db = new Database(server_addr); // configure server
}
////////////////////////////////////////////////////////////////////////////////
/// An express app:
////////////////////////////////////////////////////////////////////////////////
var express = require('express');
var app = express();
// leverage NODE_ENV to determine collectionName
var collectionName = "guesser_questions"; // configure collection
var putRoute = "guesser";
if (app.get('env') == "development") {
putRoute = "dev/" + putRoute;
collectionName = "dev_" + collectionName;
}
var collectionPromise = new Promise(function(resolve, reject) {
db.collection(collectionName, false, function(err, res) {
if (err) {
reject(err);
}
else {
resolve(res);
}
});
});
if (server_addr !== "none") {
collectionPromise.then(null, function(err) {
console.log("Cannot contact the database! Terminating...");
process.exit(1);
});
}
////////////////////////////////////////////////////////////////////////////////
/// Static content:
////////////////////////////////////////////////////////////////////////////////
app.use(express.static(__dirname + "/static"));
////////////////////////////////////////////////////////////////////////////////
/// AJAX services:
////////////////////////////////////////////////////////////////////////////////
app.get("/get/:key", function (req, res) {
var key = req.params["key"];
collectionPromise.then(function(collection) {
collection.document(key, function(err, x) {
if (err) {
// for production we should implement more sophisticated handling here. Like logging where appropriate etc.
res.status(err.code);
delete err.response
res.json(err);
}
else {
res.json(x);
}
});
}, null); // if this were rejected, we would be out already
});
// This is just a trampoline to the Foxx app:
var ep = (server_addr !== "none") ? db.route(putRoute) : undefined;
app.put("/put", function (req, res) {
req.pipe(concat( function(body) {
// check out body-parser for a express middleware which handles json automatically
ep.put("put", JSON.parse(body.toString()),
function(err, x) {
if (err) {
err.error = true;
delete err.response;
res.send(err);
}
else {
res.send(x.body);
}
});
} ));
});
////////////////////////////////////////////////////////////////////////////////
/// Now finally make the server:
////////////////////////////////////////////////////////////////////////////////
var server = app.listen(8000, function () {
var host = server.address().address
var port = server.address().port
console.log('Guesser app server listening at http://%s:%s', host, port)
});