I ran into the same problem a while ago, and spent quite a while on it. Google searches were no good. However, at while thinking about it, I noticed then when you use writeHead, you are intially told to use a content type of "text/plain". Upon digging further, it became apparent that you could also use "text/html". Then, I decided to experiment with a dynamically assigned content type - because a content-type of text/html wouldn't handle js or css files. Finally, I have managed to get it working. Now, I like working in modules, so sorry for the rather moduled code. The following code can be used to serve almost anything, as far as I have tested.
The following was the test html
index.html
<html>
<head>
<title>Website</title>
<link rel="stylesheet" href="style.css" type="text/css">
</head>
<body>
<h3>Website</h3>
</body>
</html>
The following is the linked css file
style.css
body {
background-color: green;
text-align: center;
}
The following are the modules of node that were used to create the server.
index.js
console.log("Creating server");
// Gets the required components
var server = require("./server.js");
var router = require("./router.js");
var pageserver = require("./pageserver.js");
// Starts the server.
server.Start(router.route, pageserver.serve, pageserver.reqtype);
server.js
var http = require("http");
var url = require("url");
// Starts the server
var Start = function(route, serve, reqtype) {
// Lauched when there is a request.
var onRequest = function(request, response) {
// Extracts the pathname from the url
var pathname = url.parse(request.url).pathname;
// Removes the starting "/". If this fails, then that means the request
// was without
// the "/", and so does not affect it.
try {
pathname = pathname.substring(1, pathname.length);
} catch (err) {
}
// Responds to all requests apart from that for favicon.ico
if (pathname !== "favicon.ico") {
console.log("Request has been recieved");
// Gets the path from the router
var path = route(pathname);
console.log("Path has been generated");
// Gets html or whatever will be written from the pageserver
var html = "";
html = serve(path);
console.log("Html has been generated");
// Gets the type from the pageserver
var type = reqtype(path);
console.log("Filetype has been found");
// Writes what type of data will be sent. Dynamically sets file
// ending.
response.writeHead(200, {
"Content-Type" : "text/" + type
});
// writes to output
console.log("Writing to output");
response.write(html);
console.log("Written to output");
// ends connection
response.end();
console.log("Request answered successfully");
}
};
http.createServer(onRequest).listen(8888);
console.log("Server has been started");
};
exports.Start = Start;
router.js
var path = require("path");
// Routes the request, so that a proper file can be found for it.
var route = function(pathname) {
var path = process.cwd() + "\\"; // Sets up the path to the
// current directory, the one
// that will contain the pages.
// If the file ending has been corrected before hand
var corrected = false;
if (pathname === "" || pathname === "index" || pathname === "home"
|| pathname === "index.html" || pathname === "home.html") {
// If it should be routed to the home page.
path += "index.html"; // Sets it to the index page
corrected = true;
} else {
// If it isn't any of those, then just appends the pathname
path += pathname;
}
// Splits it using "." seperator. If the lenght of the split is only one
// then no file type has been specified, and so one will be generated
var pathSplit = pathname.split(".");
if (pathSplit.length === 1 && corrected === false) {
// If the split leaves length one then appends .html to the end.
path += ".html";
}
console.log("Path is : " + path);
return path; // Returns the path.
};
exports.route = route;
pageserver.js
var path = require("path");
var fs = require("fs");
// Serves the page by returning the html.
var serve = function(path) {
var html = "";
try {
html = fs.readFileSync(path);
} catch (err) {
console.log("Reading file was unsuccesful.");
html = "ERROR";
}
return html;
};
// returns the type of file aka filename extension
var reqtype = function(path) {
var type = "";
var pathSplit = path.split(".");
if (pathSplit === 1) {
// If for somereason no ending, output as plain text file
type = "plain";
} else {
type = pathSplit[1]; // Returns thee part after the "." seperator
}
return type;
};
exports.serve = serve;
exports.reqtype = reqtype;
Please let me know if the code seems to be glitchy. Shouldn't be though.
Thanks
SbSpider