I put together a rudimentary Node app and am trying to avoid unnecessary dependencies (most notably express) for educational purposes. However, I've been running into an issue trying to serve up static files such as images or css. For security reasons, I've opted for node-static over coding my own version, but I can't seem to hook things up properly.
File structure
index.js
router.js
server.js
requestHandlers.js
package.json
views/
index.jade
public/
image.jpg
Index
var server = require("./server"),
router = require("./router"),
requestHandlers = require("./requestHandlers");
var handle = {
"/": requestHandlers.index
};
server.start(router.route, handle);
requestHandlers
var jade = require("jade");
function index(response) {
response.writeHead(200, {"Content-Type": "text/html"});
var body = jade.renderFile("views/index.jade");
response.write(body);
response.end();
}
exports.index = index;
server
var http = require("http"),
url = require("url"),
static = require("node-static"),
port = Number(process.env.PORT || 8888);
var fileServer = new static.Server("./public");
function start(route, handle) {
function onRequest(request, response) {
// NODE STATIC CODE - NOT WORKING
request.addListener('end', function () {
fileServer.serve(request, response);
}).resume();
// ROUTE HANDLING - WORKING
var pathname = url.parse(request.url).pathname;
route(handle, pathname, response);
}
http.createServer(onRequest).listen(port);
}
exports.start = start;
router
function route(handle, pathname, response) {
if (typeof handle[pathname] === 'function') {
console.log("Request handler " + pathname + " was called.");
handle[pathname](response);
} else {
console.log("No request handler found for " + pathname);
response.writeHead(404, {"Content-Type": "text/plain"});
response.write("404 Not Found");
response.end();
}
}
exports.route = route;
Finally, my index file calls out img(src="public/image.jpg"), although I've also tried just image.jpg and public/image. The / route is being called and handled appropriately, but when the index file attempts to load the image the else block of my request handler is hit (as expected, since I don't have a route for it) and nothing else happens. Could someone please explain the proper way to use node-static in this case?