Search code examples
node.jsnowjs-sockets

NowJs server different to web server


I'm playing around with nodejs and specifically looking at nowjs

I've got now up and running on a server running node and I have a separate web server. I successfully have the node server returning the client script and I reference this on the web server. This returns a 200 response code and all looks well. However I get javascript errors telling me that 'now' is undefined. As far as I understand it the 'now' variable should be available via the client script but this doesn't seem to be the case. Does anyone know if this set-up is possible? So the set-up is similar to the below pseudo code

 //Server 1 node.com
 if(request.url === '/nowjs/now.js'){
      var file = 'path_to_clientlib/now.js';
  fs.readFile(file, function(e, data) {

        if (e) {
           throw e;
        }

         response.writeHead(200,{'Content-Type': 'application/javascript'});
          response.end(data);
}

and server.com

   <script src="/jquery.js"></script>
   <script src="http://node.com/nowjs/now.js"></script> <!-- This is returned properly -->
   <script>
   $(document).ready(function(){

    now.receiveMessage = function(name, message){
      $("#messages").append("<br>" + name + ": " + message);
    }

   $("#send-button").click(function(){
     now.distributeMessage($("#text-input").val());
     $("#text-input").val("");
   });

   now.name = prompt("What's your name?", "");

   });
   </script>

  <div id="messages"></div>
  <input type="text" id="text-input">
  <input type="button" value="Send" id="send-button">

Straight away the console just returns 'now' is not defined


Solution

  • First of all there are enough modules that provide static file serving support, but if you want to manually serve a file I would do it like this...

    var mime = require('mime')   // Get mime type based on file extension. use "npm install mime"
      , util = require('util')
      , fs = require('fs');
    
    function serveFile(filename, res) {
      var filePath = process.cwd() + filename;
      var stat = fs.statSync(filePath);
    
      res.writeHead(200, {
         'Content-Type':mime.lookup(filePath),
         'Content-Length':stat.size
      });
    
      var readStream = fs.createReadStream(filePath);
    
      return util.pump(readStream, res);
    }
    
    // Your code...
    

    Or check out the module node-static on NPM or Github

    About how to use NowJS (from the docs)

    On the server

    var httpServer = require('http').createServer(function(req, response){ 
    
      // See code above how to serve static files...
    
    });
    
    httpServer.listen(8080);
    
    var nowjs = require("now");
    var everyone = nowjs.initialize(httpServer);
    
    everyone.now.logStuff = function(msg){
      console.log(msg);
    }
    

    On the client

    <script type="text/javascript" src="http://localhost:8080/nowjs/now.js"></script>
    
    <script type="text/javascript">
      now.ready(function(){
        // "Hello World!" will print on server
        now.logStuff("Hello World!");
      });
    </script>