Sequelize and socket.io to retrieve chart.js data in real time (Angular frontend)

Viewed 527

I'm new to PostgreSQL and I'm wondering if it's possible to get real-time data for my front-end chart using socket.io. I've been trying to follow some examples but I can't get it to work with my sequelize setup. I tried establishing a connection in my server.js file but when it runs it skips the code and goes right into my sequelize query. I posted how I tried connecting at the bottom.

My server.js File

const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors');

const app = express();

app.use(cors({ origin: '*' }));

global.__basedir = __dirname;

// parse requests of content-type - application/json
app.use(bodyParser.json());

// parse requests of content-type - application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));

const dotenv = require('dotenv');
dotenv.config();

const db = require('./app/models');
db.sequelize.sync().then(() => {
    console.log('Re-sync db.');
});

// simple route
app.get('/', (req, res) => {
    res.json({ message: 'Hello from server.' });
});

require('./app/routes/bitcoin.routes')(app);

// set port, listen for requests
const PORT = process.env.PORT || 8080;
app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}.`);
});

bitcoin.model.js

module.exports = (sequelize, Sequelize) => {
    const Bitcoin = sequelize.define(
        'bitcoin',
        {
            date: {
                type: Sequelize.STRING
            },
            txvolume_usd: {
                type: Sequelize.DOUBLE
            },
            adjustedtxvolume_usd: {
                type: Sequelize.DOUBLE
            },
            txcount: {
                type: Sequelize.INTEGER
            },
            marketcap_usd: {
                type: Sequelize.DOUBLE
            },
            price_usd: {
                type: Sequelize.DOUBLE
            },
            exchangevolume_usd: {
                type: Sequelize.DOUBLE
            },
            generatedcoins: {
                type: Sequelize.DOUBLE
            },
            fees: {
                type: Sequelize.DOUBLE
            },
            activeaddresses: {
                type: Sequelize.INTEGER
            },
            averagedifficulty: {
                type: Sequelize.DOUBLE
            },
            paymentcount: {
                type: Sequelize.DOUBLE
            },
            mediantxvalue_usd: {
                type: Sequelize.DOUBLE
            },
            medianfee: {
                type: Sequelize.DOUBLE
            },
            blocksize: {
                type: Sequelize.INTEGER
            },
            blockcount: {
                type: Sequelize.INTEGER
            }
        },
        { timestamps: false }
    );

    Bitcoin.removeAttribute('id');

    return Bitcoin;
};

models.index.js

const dbConfig = require('../config/db.config.js');

const Sequelize = require('sequelize');
const sequelize = new Sequelize(dbConfig.DB, dbConfig.USER, dbConfig.PASSWORD, {
    host: dbConfig.HOST,
    port: dbConfig.port,
    dialect: dbConfig.dialect,
    dialectOptions: {
        ssl: {
            require: true,
            rejectUnauthorized: false
        }
    },
    operatorsAliases: 0,

    pool: {
        max: dbConfig.pool.max,
        min: dbConfig.pool.min,
        acquire: dbConfig.pool.acquire,
        idle: dbConfig.pool.idle
    }
});

const db = {};

db.Sequelize = Sequelize;
db.sequelize = sequelize;

db.bitcoin = require('./bitcoin.model.js')(sequelize, Sequelize);

module.exports = db;

Bitcoin Controller

const db = require('../models');
const Bitcoin = db.bitcoin;
const Op = db.Sequelize.Op;

// Create and Save a new Bitcoin
exports.create = (req, res) => {
    // Validate request
    if (!req.body.date) {
        res.status(400).send({
            message: 'Content can not be empty!'
        });
        return;
    }

    // Create a Bitcoin
    const bitcoin = {
        date: req.body.date,
        txvolume_usd: req.body.txvolume_usd,
        adjustedtxvolume_usd: req.body.adjustedtxvolume_usd,
        txcount: req.body.txcount,
        marketcap_usd: req.body.marketcap_usd,
        price_usd: req.body.price_usd,
        exchangevolume_usd: req.body.exchangevolume_usd,
        generatedcoins: req.body.generatedcoins,
        fees: req.body.fees,
        activeaddresses: req.body.activeaddresses,
        averagedifficulty: req.body.averagedifficulty,
        paymentcount: req.body.paymentcount,
        mediantxvalue_usd: req.body.mediantxvalue_usd,
        medianFmedianfeeee: req.body.medianfee,
        blocksize: req.body.blocksize,
        blockcount: req.body.blockcount
    };

    // Save Bitcoin in the database
    Bitcoin.create(bitcoin)
        .then((data) => {
            res.send(data);
        })
        .catch((err) => {
            res.status(500).send({
                message: err.message || 'Some error occurred while creating the Bitcoin entry.'
            });
        });
};

exports.findAll = (req, res) => {
    const date = req.query.date;
    var condition = date ? { date: { [Op.iLike]: `%${date}%` } } : null;

    Bitcoin.findAll({ where: condition })
        .then((data) => {
            res.send(data);
        })
        .catch((err) => {
            res.status(500).send({
                message: err.message || 'Some error occurred while retrieving bitcoin entries.'
            });
        });
};

// Find a single Bitcoin entry with an id
exports.findOne = (req, res) => {
    const id = req.params.id;

    Bitcoin.findByPk(id)
        .then((data) => {
            res.send(data);
        })
        .catch((err) => {
            res.status(500).send({
                message: 'Error retrieving bitcoin entry with id=' + id
            });
        });
};
// Update a Bitcoin entry by the id in the request
exports.update = (req, res) => {
    const id = req.params.id;

    Bitcoin.update(req.body, {
        where: { id: id }
    })
        .then((num) => {
            if (num == 2) {
                res.send({
                    message: 'Bitcoin entry was updated successfully.'
                });
            } else {
                res.send({
                    message: `Cannot update Bitcoin entry with id=${id}. Maybe it was not found or the body is empty!`
                });
            }
        })
        .catch((err) => {
            res.status(500).send({
                message: 'Error updating Bitcoin entry with id=' + id
            });
        });
};
// Delete a Bitcoin entry with the specified id in the request
exports.delete = (req, res) => {
    const id = req.params.id;

    Bitcoin.destroy({
        where: { id: id }
    })
        .then((num) => {
            if (num == 1) {
                res.send({
                    message: 'Bitcoin entry was deleted successfully!'
                });
            } else {
                res.send({
                    message: `Cannot delete Bitcoin entry with id=${id}. Maybe it was not found!`
                });
            }
        })
        .catch((err) => {
            res.status(500).send({
                message: 'Could not delete Bitcoin entry with id=' + id
            });
        });
};
// Delete all Bitcoin entries from the database.
exports.deleteAll = (req, res) => {
    Bitcoin.destroy({
        where: {},
        truncate: false
    })
        .then((nums) => {
            res.send({ message: `${nums} Bitcoin entries were deleted successfully!` });
        })
        .catch((err) => {
            res.status(500).send({
                message: err.message || 'Some error occurred while removing all bitcoin entries.'
            });
        });
};

Changes I Tried To server.js

const express = require('express');
const app = express();
const server = require('http').createServer(app);
const io = require('socket.io')(server);
const bodyParser = require('body-parser');
const cors = require('cors');

let timerId = null;
let sockets = new Set();

app.use(express.static(__dirname + '/dist'));

io.on('connection', (socket) => {
    sockets.add(socket);
    console.log(`Socket ${socket.id} added`);

    if (!timerId) {
        startTimer();
    }

    socket.on('clientdata', (data) => {
        console.log(data);
    });

    socket.on('disconnect', () => {
        console.log(`Deleting socket: ${socket.id}`);
        sockets.delete(socket);
        console.log(`Remaining sockets: ${sockets.size}`);
    });
});
0 Answers
Related