Server-Side Scripting/Iteration/Node.js (Express)

From Wikiversity
Jump to navigation Jump to search

routes/lesson4.js[edit | edit source]

// Demonstrates conditions, while loops and for loops using
// Celsius and Fahrenheit temperature conversion tables.
//
// References:
//  https://www.mathsisfun.com/temperature-conversion.html
//  https://en.wikibooks.org/wiki/JavaScript
//  https://stackabuse.com/get-query-strings-and-parameters-in-express-js/
//  https://flaviocopes.com/express-forms/
//  https://expressjs.com/en/guide/routing.html

const express = require('express')
const fs = require("fs");
const handlebars = require('handlebars');
const router = express.Router()

router.get("/", function (request, response) {
    let source = fs.readFileSync("./templates/lesson4.html");
    let template = handlebars.compile(source.toString());
    let data = {
        table: ""
    }
    result = template(data);
    response.send(result);
});

router.post("/", function (request, response) {
    let start = Number(request.body.start);
    let stop = Number(request.body.stop);
    let increment = Number(request.body.increment);
    let submit = request.body.submit;

    let result = "";
    if (submit == "Celsius") {
        result = processCelsius(start, stop, increment);
    }
    else if (submit == "Fahrenheit") {
        result = processFahrenheit(start, stop, increment);
    }
    else {
        result = "Unexpected submit value: " + submit;
    }

    let source = fs.readFileSync("./templates/lesson4.html");
    let template = handlebars.compile(source.toString());
    let data = {
        table: result
    }
    result = template(data);
    response.send(result);
});

function processCelsius(start, stop, increment) {
    let result = "<table><tr><th>Celsius</th><th>Fahrenheit</th></tr>";
    let celsius = start;
    while (celsius <= stop) {
        let fahrenheit = celsius * 9 / 5 + 32;
        result += "<tr><td>" + celsius + "</td>";
        result += "<td>" + fahrenheit.toFixed(1) + "</td></tr>";
        celsius += increment;
    }
    result += "</table>";
    return result;
}

function processFahrenheit(start, stop, increment) {
    let result = "<table><tr><th>Fahrenheit</th><th>Celsius</th></tr>";
    for (let fahrenheit = start; fahrenheit <= stop; fahrenheit += increment) {
        let celsius = (fahrenheit - 32) * 5 / 9;
        result += "<tr><td>" + fahrenheit + "</td>";
        result += "<td>" + celsius.toFixed(1) + "</td></tr>";
    }
    result += "</table>";
    return result;
}

module.exports = router;

templates/lesson4.html[edit | edit source]

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Lesson 4</title>
    <link rel="stylesheet" href="styles.css">
    <style>
        p {
            min-height: 1em;
        }
    </style>
</head>

<body>
    <h1>Temperature Conversion</h1>
    <form method="POST">
        <p><label for="start">Start:</label>
            <input type="text" id="start" name="start" value="0">
        </p>
        <p><label for="stop">Stop:</label>
            <input type="text" id="stop" name="stop" value="100">
        </p>
        <p><label for="increment:">Increment</label>
            <input type="text" id="increment" name="increment" value="10">
        </p>
        <p><input type="submit" name="submit" value="Celsius">
            <input type="submit" name="submit" value="Fahrenheit">
        </p>
    </form>
    {{{table}}}
</body>

</html>

Try It[edit | edit source]

See Server-Side Scripting/Routes and Templates/Node.js (Express) to create a test environment.