Minimal chat example using Node.js on Heroku.
Deployed here https://node-minichat.herokuapp.com/
The applications node and npm will be needed. Install them from here
https://nodejs.org/en/download/
Then add a package.json file to your project by running:
npm init --yes
Install the neccessary dependencies and add then to the package.json by
running:
npm install --save [email protected]
npm install --save [email protected]
Create an index.js file. This is the main node application file for the
backend. First thing to do in index.js is import our libraries:
var server = require('http').createServer();
var wss = new require('ws').Server({server: server});
var express = require('express');
var app = express();Add a variable to configure the port we will use. Note: process.env.PORT is
something that Heroku will use later on, by default this will use the port 8080.
var port = process.env.PORT || 8080;We need to configure the express webframework to serve the static html and js frontend application.
// Serve files from the static directory.
app.use('/', express.static(__dirname + '/static'));Now we need to configure the websocket connection where we will send and receive chat messages.
wss.on('connection', function(ws) {
  // Listen for messages sent from the frontend clients.
  ws.on('message', function(msg) {
    // When a message is received broadcast it out to each connected client.
    wss.clients.forEach(function(client) {
      client.send(msg);
    });
  });
});Finally, start the http web server.
// Start up the web server.
server.on('request', app);
server.listen(port, function() {
  console.log('Node app is running on port', port);
});Create a folder named static. Inside static create index.html with three
things:
- a div to display messages in
- a form to submit messages from
- a script to include main.js
<!DOCTYPE html>
<div id="messages"></div>
<form id="message-form">
  <input type="text" id="message">
  <button type="submit">Send</button>
</form>
<script src="/main.js"></script>Now we need to write the frontend application in main.js. Create main.js
also inside the static folder. First thing to do is create a Chat class. On
initialization this class will bind to the html elements from index.html and
open a connection to the backend.
// Initializes Chat
function Chat() {
  // Shortcuts to DOM Elements.
  this.messageList = document.getElementById('messages');
  this.messageForm = document.getElementById('message-form');
  this.messageInput = document.getElementById('message');
  // Saves message on form submit.
  this.messageForm.addEventListener('submit', this.saveMessage.bind(this));
  // Focus on the input
  this.messageInput.focus();
  // Open websocket connection.
  this.ws = new WebSocket(location.origin.replace(/^http/, 'ws'));
  this.ws.onmessage = this.displayMessage.bind(this);
}
window.onload = function() {
  new Chat();
};Now there are two functions referenced in the initialization code that need to
be defined saveMessage and displayMessage. Let's start with displaying a
message.
// Displays a Message in the UI.
Chat.prototype.displayMessage = function(message) {
  var msg = document.createElement('div');
  msg.innerHTML = message.data;
  this.messageList.appendChild(msg);
};Finally, we will use the Chat class's this.ws websocket connection to send a
message to the backend when the user submits a message to the messageForm.
// Sends user's message to the backend
Chat.prototype.saveMessage = function(e) {
  e.preventDefault();
  // Check that the user entered a message.
  if (this.messageInput.value) {
    // Send message to backend
    this.ws.send(this.messageInput.value);
    // Clear message text field and focus on it.
    this.messageInput.value = '';
    this.messageInput.focus();
  }
};In a new terminal run:
node index.js
Check it out at http://localhost:8080/
Press control+c to stop running the web server locally.
Sign up for a Heroku account here https://signup.heroku.com/signup/dc you will need an email address.
Then downloand and install the Heroku CLI from here https://devcenter.heroku.com/articles/heroku-command-line#download-and-install and login
heroku login
To create a new Heroku project run:
heroku create
In order for Heroku to know how to run the backend create a file named
Procfile with the contents:
web: node index.js
Deploy your code:
git push heroku master
Ensure that at least one instance of the app is running:
heroku ps:scale web=1
Finally this command will open your application in a browser:
heroku open