22

I run a simple http server with Node.js:

var http = require('http');
var fs = require('fs');
var index = fs.readFileSync('index.html');
var sensor = require('ds18x20');
var temp = sensor.get('sensorID');

http.createServer(function(req,res) {
  res.writeHead(200, {'Content-Type': 'text/html'});
  res.end(index);
}).listen(80);

console.log(temp);

my index.html file:

<html>
   <head>
   </head>
<body>
My temperature:
//space for variable: temp
</body>
</html>

Now, I want to print the server-side variable: temp in my index.html file. But I have no idea how to do it.

Maybe somebody can help me with the exchange of Variables from the server to the client.

2 Answers 2

30

As you can read in @WebServer's answer there is a variety of template engines in node.
I want to give you an example of using one of them - EJS:

First install it:

npm install ejs

server.js:

var http = require('http');
var ejs = require('ejs');
var fs = require('fs');

http.createServer(function(req,res) {
  res.writeHead(200, {'Content-Type': 'text/html'});

  //since we are in a request handler function
  //we're using readFile instead of readFileSync
  fs.readFile('index.html', 'utf-8', function(err, content) {
    if (err) {
      res.end('error occurred');
      return;
    }
    var temp = 'some temp';  //here you assign temp variable with needed value

    var renderedHtml = ejs.render(content, {temp: temp});  //get redered HTML code
    res.end(renderedHtml);
  });
}).listen(80);

Your view might look like this:

<html>
   <head>
   </head>
<body>
My temperature: <%= temp %>
</body>
</html>

EJS also escapes temp (and other variables you pass to the view) for you, so you don't have to worry about XSS attacks.

Edit

You can also compile the template if you don't want to read the file on each request:

var http = require('http');
var ejs = require('ejs');
var fs = require('fs');

//we are not in a request handler so we may use readFileSync
var content = fs.readFileSync('index.html', 'utf-8');
var compiled = ejs.compile(content);

http.createServer(function(req,res) {
    var temp = 'some temp';

    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(compiled({temp: temp}));
}).listen(80);

Edit 2 (answering your comment question)

Here is a simple example of using Express and AJAX:

server.js:

var http = require('http');
var express = require('express');
var app = express();

app.configure(function() {
    app.set('view engine', 'ejs');  //tell Express we're using EJS
    app.set('views', __dirname + '/views');  //set path to *.ejs files
    app.use(app.router);
    //put your static files (js, css, images) into /public directory
    app.use('/public', express.static(__dirname + '/public'));
});

//get some server data for sending it to the client
var getData = function() {
    return Math.random().toString();
}

app.get('/', function(req, res) {
    //render index.ejs file
    res.render('index', {val: getData()});
});

app.get('/ajax', function(req, res) {
    res.send(getData());
});

http.createServer(app).listen(80);

views/index.ejs:

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>
<script src="/public/js/request.js"></script>
</head>
<body>

    <h1>Val: <span id="val"><%=val%></span></h1>

    <button id="loadRequest">Refresh</button>

</body>
</html>

public/js/request.js:

$(function() {
    $('#loadRequest').click(function() {
        $.get('/ajax', function(res) {
            $('#val').text(res);
        });
    });
});

Hope this helps

Sign up to request clarification or add additional context in comments.

10 Comments

thank you a lot, this is exactly what i'm searching for! thanks thanks thanks
you're welcome :) By the way EJS is compatible with Express framework
Hey maybe you can help me a second time, i take a look at the ejs documentation and i do understand the basics. The next step is to refresh my variable temp, with a click on a button in my index.html. At this moment i solved this with a function at the server.js which i exports. But i only can read the new temp variable at the console, with console.log(temp). I can't refresh the html, i know its a little bit complicated. Maybe you have an example were i can take a look at. Thanks a lot
You should use AJAX. The scenario is following: user clicks a button, you send AJAX request (this is pretty easy with jQuery), node.js server takes the request, updates temp, and sends an updated temp as a response, then you update your HTML tag with a new value on the client. The easiest way to take a request (on a server side) - is to use Express. If you have any questions about an implementation - feel free to ask me
okay, first i have to take a look at Express, and how it works to takes the request and send a response. After this there will be more questions ;-)
|
-1

You need a templating engine to write some data into page. check out https://github.com/joyent/node/wiki/modules#wiki-templating

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.