En el ejemplo anterior, Crear una aplicación en tiempo real con Node.js los datos no se almacenaban de forma permanente. Esto significa que cada vez que reiniciemos el servidor Node.js, los datos volverán a estar vacíos. Para poder almacenar los datos introducidos, debemos utilizar una base de datos.
En este artículo, utilizaremos la base de datos mySQL que ya es bastante famosa. La misma técnica que puede utilizar si se utiliza otra base de datos.
El proyecto que vamos a crear es una continuación del proyecto sobre Creación de aplicaciones en tiempo real con Nodes.js. Si aún no lo tienes, sigue el artículo.
Pasos para crear una aplicación en tiempo real con Node.js y MySQL
- Descargue e instale MySQL.
- Crear una base de datos MySQL como el siguiente script
CREATE TABLE 'voting' ( 'id' INTEGER(11) NOT NULL AUTO_INCREMENT, 'name' VARCHAR(12) COLLATE utf8mb4_general_ci NOT NULL, 'time' DATETIME NOT NULL DEFAULT current_timestamp(), PRIMARY KEY USING BTREE ('id') ) ENGINE=InnoDB AUTO_INCREMENT=1 ROW_FORMAT=DYNAMIC CHARACTER SET 'utf8mb4' COLLATE 'utf8mb4_general_ci' ;
- Una vez que tenemos una base de datos MySQL, todo lo que necesitamos a continuación es un controlador que conecta Node.js con MySQL. Abre cmd en la carpeta del proyecto que hemos creado («C:\bardimin), y escribe el comando
npm install mysql
- El siguiente paso es editar el archivo «server.js».
- A continuación añadimos un script para la conexión a MySQL en el fichero server.js
Creating MySQL connection. var sqlCon = mysql.createPool({ host: 'localhost', user: 'root', password: "', database: 'myDatabase', //Change to your database name });
- Cuando el servidor se ejecuta por primera vez, necesitamos consultar la tabla de votaciones como datos iniciales y asignar el valor de la variable «myData».
Create initial data var initData = function (_callback) { sqlCon.getConnection(function (err, connection) { if (err) { _callback (false) } connection.query('SELECT 'name', COUNT('name') AS 'total' FROM 'voting' GROUP BY 'name' ORDER BY 'name'', function (error, result) { connection.release(); if (!error) { myData.akbar = result [0] .total; myData.goldie = result [1] .total; _callback (true); } if (error) { _callback (false); } }); }); };
- Y cuando el usuario envía, hacemos el proceso de almacenamiento en la tabla de votaciones y actualizamos la variable «misDatos»
var addData = function (data, _callback) { sqlCon.getConnection(function (err, connection) { if (err) { _callback (false) } connection.query('INSERT INTO voting SET name= ?', [data] , function (error) { connection.release(); if (!error) { if (data === "akbar") { myData.akbar++; } if (data === "goldie") { myData.goldie++; } _callback (true); } if (error) { _callback (false); } }); }); };
- El script completo del archivo server.js es el siguiente:
var app = require("express")(); var http = require('http'). Server(app); var io = require("socket.io")(http); var mysql = require("mysql"); Listening port http.listen(3000, function () { console.log("Listening on 3000"); }); html file app.get("/", function (req, res) { res.sendFile(__dirname + '/index.html'); }); Creating MySQL connection. var sqlCon = mysql.createPool({ host: 'localhost', user: 'root', password: "', database: 'yii2.socket', //Change to your database name }); Global Variable var myData = {akbar: 0, goldie: 0}; var isInitData = false; Create initial data var initData = function (_callback) { sqlCon.getConnection(function (err, connection) { if (err) { _callback (false) } connection.query('SELECT 'name', COUNT('name') AS 'total' FROM 'voting' GROUP BY 'name' ORDER BY 'name'', function (error, result) { connection.release(); if (!error) { myData.akbar = result [0] .total; myData.goldie = result [1] .total; _callback (true); } if (error) { _callback (false); } }); }); }; var addData = function (data, _callback) { sqlCon.getConnection(function (err, connection) { if (err) { _callback (false) } connection.query('INSERT INTO voting SET name= ?', [data] , function (error) { connection.release(); if (!error) { if (data === "akbar") { myData.akbar++; } if (data === "goldie") { myData.goldie++; } _callback (true); } if (error) { _callback (false); } }); }); }; This is auto initiated event when Client connects to Your Machien. io.on("connection", (socket) => { console.log("A user is connected"); if (!isInitData) { initData(function (res) { if (res) { socket.emit('newData', myData); isInitData = true; } else { console.log("Initial data error"); } }); } else { socket.emit('newData', myData); } socket.on('addData', (data) => { addData(data, function (res) { if (res) { io.emit('newData', myData); console.log("Add new data success"); } else { console.log("Add new data error"); } }); }) });
Buena suerte…