By tonysziklai
This may be an insanely stupid question, even for a node.js newbie. I set up a droplet running 64-bit Ubuntu and installed all of the requisite Node.js packages. I am building a chatroom application using the Node.js in Action book. For this project, I created an HTTP server for serving static content. For some reason, I am able to hit the server over port 3000 (and get a 404 error message), but I can’t seem to serve the static content that I created in the public directory (i.e. index.html file). Below is the server and the index.html file. Can anyone give me a clue why the content is not being served? Assume all the files are in their correct directory locations on the server.
Server:
var http = require(‘http’); var fs = require(‘fs’); var path = require(‘path’); var mime = require(‘mime’); var cache = {};
function send404(response) { response.writeHead(404,{‘Content-Type’: ‘text/plain’}); response.write(‘Error 404: resource not found.’); response.end(); } function sendFile(response, filePath, fileContents) { response.writeHead( 200, {“content-type”: mime.lookup(path.basename(filepath))} ); response.end(fileContents); }
function serveStatic(response, cache, absPath) { if (cache[absPath]) { sendFile(response, absPath, cache[absPath]); } else { fs.exists(absPath, function(exists) { if (exists) { fs.readFile(absPath, function(err, data) { if (err) { send404(response); } else { cache[absPath] = data; sendFile(response, absPath, data); } }); } else { send404(response); } }); } }
var server = http.createServer(function(request,response) { var filePath = false; if (request.url == ‘/’) { filepath = ‘public/index.html’; } else { filePath = ‘public’ + request.url; } var absPath = ‘./’ + filePath; serveStatic(response, cache, absPath); });
server.listen(3000, function() { console.log(“Server listening on port 3000.”); });
Index.html file
<!DOCTYPE html> <html lang=“en”> <head> <title>Chat</title> <link rel=“stylesheet” href=“/stylesheets/style.css”><link> </head> <body> <div id=“content”> <div id=“room”></div> <div id=“room-list”></div> <div id=“messages”></div>
<<form id=“send-form”> <input id=“send-message” /> <input id=“send-button” type=“submit” value=“Send” />
<div id='help'>
Chat commands:
<ul>
<li>Change nickname: <code>/nick [username]</code></li>
<li>Join/create room: <code>/join [room name] </code></li>
</ul>
</div>
</form> </div>
<script src=“socket.io/socket.io.js” type=“text/javascript”></script> <script src=“http://code.jquery.com/jquery-1.8.0.min.js"type="text/javascript”></script> <script src=“/javascripts/chat.js” type=“text/javascript”></script> <script src=“/javascripts/chat_ui.js” type=“text/javascript”></script> </body> </html>
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
So taking a quick look at this, if I go to htttp://my.ip.address:3000/index.html I can see the web page. If I just go to the root, I get the 404. So that led me to look at this bit: <br> <br><pre> <br>if (request.url == ‘/’) { <br> filepath = ‘public/index.html’; <br>} else { <br> filePath = ‘public’ + request.url; <br>} <br></pre> <br> <br>With this pulled out on it’s own, you’ll probably smack yourself in the forehead. It’s just a simple miss-capitalization! <code>filepath</code> should be <code>filePath</code>
No problem! I think we’ve all spent embarrassingly long amounts of time debugging things in the past only to find out that that we misspelled something.
Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.
Full documentation for every DigitalOcean product.
The Wave has everything you need to know about building a business, from raising funding to marketing your product.
Stay up to date by signing up for DigitalOcean’s Infrastructure as a Newsletter.
New accounts only. By submitting your email you agree to our Privacy Policy
Scale up as you grow — whether you're running one virtual machine or ten thousand.
Sign up and get $200 in credit for your first 60 days with DigitalOcean.*
*This promotional offer applies to new accounts only.