Jump to content

Server-Side Scripting/SQL Databases/Node.js (Express MySQL)

From Wikiversity

routes/lesson9.js

[edit | edit source]
// This program creates and displays a temperature database
// with options to insert, update, and delete records.
//
// References:
//  https://en.wikibooks.org/wiki/JavaScript
//  https://zellwk.com/blog/async-await-express/
//  https://www.mysqltutorial.org/mysql-nodejs/select/


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

const HOST = "localhost";
const USER = "root";
const PASSWORD = "password";
const DATABASE = "Temperature";

router.get("/", async (request, response) => {
    let result = "";

    try {
        await checkDatabase();
        await checkTable();
        result = await getData();
    }
    catch(error) {
        result = error;
    }

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

router.post("/", async (request, response) => {
    let result = "";

    try {
        let country = request.body.country.trim();
        let temperature = request.body.temperature.trim();

        if (!await countryExists(country)) {
            await insertCountry(country, temperature)
        } else if (temperature != "") {
            await updateCountry(country, temperature)
        } else {
            await deleteCountry(country)
        }

        result = await getData();
    }
    catch(error) {
        result = error;
    }

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

async function checkDatabase() {
    let database = "INFORMATION_SCHEMA";
    let sql = `
        SELECT COUNT(*) AS Count 
        FROM INFORMATION_SCHEMA.SCHEMATA
        WHERE SCHEMA_NAME = 'Temperature';
    `;
    let parameters = [];
    let data = await mysqlQuery(database, sql, parameters);

    if (data[0].Count > 0) {
        return;
    }

    sql = "CREATE DATABASE Temperature;";
    parameters = [];
    await mysqlQuery(null, sql, parameters);
}

async function checkTable() {
    let database = "INFORMATION_SCHEMA";
    let sql = `
        SELECT COUNT(*) AS Count
        FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = 'Temperature'
        AND TABLE_NAME = 'Countries';
        `
    let parameters = [];
    let data = await mysqlQuery(database, sql, parameters);
    if (data[0].Count > 0) {
        return;
    }

    sql = `
        CREATE TABLE Countries(
        ID INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
        Country VARCHAR(35) UNIQUE NOT NULL,
        Temperature REAL NOT NULL);
        `
    parameters = [];
    await mysqlQuery(DATABASE, sql, parameters);
}

async function getData() {
    let database = DATABASE;
    let sql = `
        SELECT ID, Country, Temperature FROM Countries;
        `
    let parameters = [];
    let data = await mysqlQuery(database, sql, parameters);

    let result = "<table><tr><th>ID</th>";
    result += "<th>Country</th>";
    result += "<th>Temperature</th></tr>";
    for (i = 0; i < data.length; i++) {
        result += "<tr><td>" + data[i].ID + "</td>"
        result += "<td>" + data[i].Country + "</td>"
        result += "<td>"+ data[i].Temperature + "</td></tr>"
    }
    result += "</table>"    
    return result;
}

async function countryExists(country) {
    let database = DATABASE;
    let sql = `
        SELECT EXISTS(
        SELECT * FROM Countries
        WHERE Country = ?) AS Count;
        `
    let parameters = [country];
    let data = await mysqlQuery(database, sql, parameters);
    let result = !!data[0].Count;
    return result;
}

async function insertCountry(country, temperature) {
    let database = DATABASE;
    let sql = `
        INSERT INTO Countries (Country, Temperature)
        VALUES(?, ?);
        `
    let parameters = [country, temperature];
    await mysqlQuery(database, sql, parameters);
}

async function updateCountry(country, temperature) {
    let database = DATABASE;
    let sql = `
        UPDATE Countries
        SET Temperature = ?
        WHERE Country = ?;
        `
    let parameters = [temperature, country];
    await mysqlQuery(database, sql, parameters);
}

async function deleteCountry(country) {
    let database = DATABASE;
    let sql = `
        DELETE FROM Countries
        WHERE Country = ?;
        `
    let parameters = [country];
    await mysqlQuery(database, sql, parameters);
}

async function mysqlConnection(database) {
    return new Promise((resolve, reject) => {
        let connection = mysql.createConnection({
          host: HOST,
          user: USER,
          password: PASSWORD,
          database: database,
        });

        connection.connect( (error) => {
            if (error) {
                reject(error);
            } else {
                resolve(connection);
            }
        });
    });
}

async function mysqlQuery(database, sql, parameters) {
    let connection = await mysqlConnection(database);

    return new Promise((resolve, reject) => {
        connection.query(sql, parameters, function(error, rows) {
            if (error) {
                reject(error);
            } else {
                resolve(rows);
            }
        });
        
        connection.end();
    });
}

module.exports = router;

templates/lesson9.html

[edit | edit source]
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Lesson 9</title>
    <link rel="stylesheet" href="styles.css">
</head>

<body>
    <h1>Temperature Data Entry</h1>
    <p>Enter country and temperature. Enter again to update.</p>
    <p>Enter country without temperature to delete.</p>
    <form method="POST">
        <p><label for="country">Country:</label>
            <input type="text" id="country" name="country" required>
        </p>
        <p><label for="stop">Temperature:</label>
            <input type="text" id="temperature" name="temperature">
        </p>
        <p><input type="submit" name="submit" value="Submit"></p>
    </form>
    <hr>
    {{{table}}}
</body>
</html>

Try It

[edit | edit source]

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

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy