Skip to content

Getting Started

curraheerecursed edited this page Jul 12, 2011 · 27 revisions
Clone this wiki locally

Getting Started with NowJS


NowJS is a node.js module, which means you'll need node installed before proceeding. If you don't have node yet, proceed to the node.js website for an introduction and instructions on how to get it.

After installing node, you'll need to grab npm (a node.js package manager). Once npm is installed, you can type npm install now at the command line and get access to NowJS.

Understanding The Basic Idea

NowJS provides a now object that both the client and the server share access and control. A now object is created for each client when it connects to the server. now acts as a regular Javascript object; what's special is that both the client and the server can modify it, ie. store data and define functions, for the other side to use.

Only the client directly uses now, whereas the server uses either or, both of which are not used by the client. controls simultaneously all now objects of connected clients. (everyone is in fact a group that contains all clients. You will learn more about using groups with NowJS in the future.) accesses only the client that is currently interacting with the server.

Building Your First NowJS Server

Here is a fast demonstration on how to write a simple chat server using NowJS. In this example you will see how now is used for information sharing. You can find the code here.

Setting Up

The "helloworld_server.js" file starts with the following code:

var fs = require('fs');
var server = require('http').createServer(function(req, response){
  fs.readFile(__dirname+'/helloworld.html', function(err, data){
    response.writeHead(200, {'Content-Type':'text/html'});

These lines are required to set up the server and prepare the "helloworld.html" file for the client.

Creating everyone

var nowjs = require("../../");
var everyone = nowjs.initialize(server);

This is where the the server creates the everyone group. Notice that no now object exists right now; instead, they will be created implicitly when clients connect.

Keeping Track Of Connections

everyone.on("connect", function(){
  console.log("Joined: " +;

everyone.on("disconnect", function(){
  console.log("Left: " +;

Whenever a client connects or disconnects, a log will be recorded in the console. Keep an eye on the use of here. refers to the now object that belongs to this specific client, while name is a field to be created by the client (as we'll see in a minute). This step is optional; it doesn't affect the behavior of either the server or the client.

Sending Out The Message = function(message){, message);

Here is the tricky part. We see two functions, namely distributeMessage, which is defined here on the server, and receiveMessage, whose definition is not given. This is one key attribute of now: distributeMessage is defined here, but it is meant to be actually called by the client. Inside distributeMessage, we have a, which accesses the now of the caller.

On The Client, In The Meantime...

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

This is how the client receives the message from the server. Remember that on the server, receiveMessage is defined on As a result, when the server calls receiveMessage, all clients will carry out this function. Also, the first argument (as on the server) is the name of the client who calls distributeMessage. This way, each client sees the name of whoever sends the message followed by the message itself.

Other Than That...

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

Here distributeMessage is linked with a "send" button. Upon clicking, distributeMessage is called by the client. Once again, on the server distributeMessage is defined on, thus when any client calls this function, it gets executed on server.

Lastly, The Name = prompt("What's your name?", "");

When first connected, a prompt window asks for the name of the client and the name is stored to a newly created field, which will be used as a tag for the client.

Putting Things Together

When a client connects to the server, a now object for this client is created and a name can be entered. If the client clicks the "send" button, distributeMessage is called on the server, with the local field referring to the name of the caller. distributeMessage calls receiveMessage on all clients, passing the caller's name and the message as arguments. All clients then execute receiveMessage locally, printing the message as well as its sender.

To make things a little clearer, this table shows where each function is defined, called, and executed:

distributeMessage receiveMessage
defined server client
called client server
executed server client
Something went wrong with that request. Please try again.