Serving static files in Node.js using node-static

709 Views Asked by At

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?

0

There are 0 best solutions below