Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I send information from NodeJS server to client side?

For example, I want to signal to the client side that a username sent via the POST method in an HTML form already exists in my database.

I know how to recuperate POST data with body-parser and I know how to look it up in a MySQL database.

I know that I could use Ajax to write an error message directly on the form. What does my NodeJS server need to send and how does it send this information?

I've searched through numerous tutorials and I just found solutions where they send a new HTML page. I want to keep my web page the same and use functions like appendChild() to post the error message.

like image 910
Stefan N Avatar asked Jun 07 '17 14:06

Stefan N


1 Answers

There are a couple of ways you could send data from server-side, so NodeJS, to client-side - which I assume in your case would be some JavaScript file like main.js that handles DOM manimulation.

So, the 1st way you could send data is through a templating engine like Handlebars, for example. There is an easy to use module for express you could get here: hbs.

Now to quickly summarize how an engine like that works, we are basically sending an HTML file like you probably saw in the tutorials, however, a templating engine like Handlebars allows us to send actual data with that file dynamically, so what we would do is render a specific Handlebars template (which in core is just HTML), and pass in a JavaScript object to the render call which would contain all the data you want to pass into that file and then access it in the .hbs file.

So on the server-side, we would write something like this, assuming we have a file called home.hbs and set up Handlebars as the templating engine:

router.get('/home', function(req,res) {
   var dataToSendObj = {'title': 'Your Website Title', 'message': 'Hello'};
   res.render('home',dataToSendObj);
});

And access in home.hbs like this:

<html>
   <header>
      {{title}}
   </header>
   <body>
      message from server: {{message}}
   </body>
</html>

Now, the issue with this approach is that if you wanted to update the data on the page dynamically, without having to reload the page, using a templating engine would not be ideal. Instead, like you said, you would use AJAX.

So, the 2nd way you could send data from your NodeJS server to the front-end of your website, is using an asynchronous AJAX call.

First, add a route to whatever route handler you are using for AJAX to make a call to. This where you have some logic to perhaps access the database, make some checks and return some useful information back to client.

router.get('/path/for/ajax/call', function(req,res) {
   // make some calls to database, fetch some data, information, check state, etc...
   var dataToSendToClient = {'message': 'error message from server'};
   // convert whatever we want to send (preferably should be an object) to JSON
   var JSONdata = JSON.stringify(dataToSendToClient);
   res.send(JSONdata);
});

Assuming you have some file such as main.js, create an AJAX request with callbacks to listen to certain event responses like this:

var req = new XMLHttpRequest();
var url = '/path/for/ajax/call';

req.open('GET',url,true); // set this to POST if you would like
req.addEventListener('load',onLoad);
req.addEventListener('error',onError);

req.send();

function onLoad() {
   var response = this.responseText;
   var parsedResponse = JSON.parse(response);

   // access your data newly received data here and update your DOM with appendChild(), findElementById(), etc...
   var messageToDisplay = parsedResponse['message'];

   // append child (with text value of messageToDisplay for instance) here or do some more stuff
}

function onError() {
  // handle error here, print message perhaps
  console.log('error receiving async AJAX call');
}

To summarize the above approach using AJAX, this would be the flow of the interaction:

  • Action is triggered on client-side (like button pressed)
  • The event handler for that creates a new AJAX request, sets up the callback so it knows what to do when the response comes back from the server, and sends the request
  • The GET or POST request sent is caught by our route handler on the server
  • Server side logic is executed to get data from database, state, etc...
  • The new data is fetched, placed into a JSON object, and sent back by the server
  • The client AJAX's event listener for either load or error catches the response and executes the callback
  • In the case of a successful response load, we parse the response, and update the client-side UI

Hope this is helpful!

like image 189
Andrii Dobroshynski Avatar answered Nov 13 '22 02:11

Andrii Dobroshynski