Как отправить данные, полученные из базы данных из Node.js по маршрутам, во внешний файл JavaScript? - PullRequest
1 голос
/ 17 мая 2019

* Я понимаю, что здесь много кода, но я долго и без радости боролся с этой проблемой.

Приложение Node.js с Express, базой данных MySQL и движком шаблонов EJS,Я абсолютный новичок.

У меня есть файл javaScript (getScoresData.js), который возвращает данные из базы данных MySQL и содержит код, который создает объект JavaScript.Этот объект содержит значения, которые мне нужно отправить в интерфейс (для создания диаграммы данных).Код возвращает объект на консоль, когда я запускаю файл getSCoresData.js, поэтому я знаю, что эта часть работает.

Но я понятия не имею, как правильно реализовать этот файл code / js для отправки объекта через мои маршруты во внешний интерфейс.Я также не знаю, где getScoresData.js должен фактически находиться в структуре проекта или как / если мне следует модульно преобразовать файл getScoresData.js.

Структура: ..

project/ 
  app/ 
    routes.js 
  config/ 
    database.js 
    passport.js 
  models/ 
    getScoresData.js 
  public/ 
    scripts/ 
       dataGraph.js 
    views/ 
server.js 

getScoresData.js ниже


// db connection
var mysql = require('mysql');
var dbconfig = require('../config/database');
const connection = mysql.createConnection(dbconfig.connection);

//Sql Query
const scoreQuery = "SELECT question1, question2, question3, question4, question5, question6, question7, question8 FROM assessment_score";

//variable to hold score array
var scoreArray;


//returning the sql query
connection.query(scoreQuery, function (err, result) {
    if (err) throw err;

    //running getData() function
    getData(result);
    console.log(scoreArray);

    // Slicing the array to make 8 categories
    var category1 = scoreArray.slice(0,1);
    var category2 = scoreArray.slice(2,3);
    var category3 = scoreArray.slice(4,5);
    var category4 = scoreArray.slice(6,7);

    //parsing and accumlating each category score
    var cat1Total = totalScore(category1);
    var cat2Total = totalScore(category2);
    var cat3Total = totalScore(category3);
    var cat4Total = totalScore(category4);


    //this is the object I want to send to client side to use in the graphData.js file
    const categories = {cat1Total, cat2Total, cat3Total, cat4Total}

});

//function to turn sql result into an array of strings
function getData(result) {

    Object.keys(result).forEach(function(key) {
        const values = result[key];
        return scoreArray = Object.values(values);
    });
}

// function to parse the strings into numbers and accumulate them
function totalScore(categoryScore){
    return categoryScore.reduce((accum,scoreArray) =>
        {
            const splitValues = scoreArray.split('/');

            return {
                score:accum.score + parseInt(splitValues[0]),
                maxScore:accum.maxScore + parseInt(splitValues[1]),
            }
        },{score:0,maxScore:0}
    );
}

файл rout.js

  • Я хочу отправитьданные по маршруту /profile, поэтому при входе пользователей в свой профиль будет отображаться график данных их оценок.
module.exports = function(app, passport){
    app.get('/', function(req, res){
        res.render('index.ejs');
    });

    app.get('/login', function (req, res){
        res.render('login.ejs', {message: req.flash('loginMessage')});
    });

    app.post('/login', passport.authenticate('local-login',{
            successRedirect: '/profile',
            failureRedirect: '/login',
            failureFlash: true
        }),
        function(req, res){
            if(req.body.remember){
                req.session.cookie.maxAge = 1000 * 60 * 3;
            }else{
                req.session.cookie.expires = false;
            }
            res.redirect('/');
        });


    app.get('/profile', isLoggedIn, function (req, res) {
        res.render('profile.ejs', {user:req.user
        })
    });


};


function isLoggedIn(req, res, next) {
    if(req.isAuthenticated())
        return next();

    res.redirect('/');
}); 

файл dataGraph.js - где я хочу использовать объект categories для создания графика


var ctx = document.getElementById("myChart").getContext('2d');

//Where I want to use the data sent through routes
var barTotalCategoryScores = [categories.cat1Total.score, categories.cat2Total.score, categories.cat3Total.score, categories.cat4Total.score];

var labels = ["Java & Design", "Build & Versioning"];

var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: labels,
        datasets: barTotalCategoryScores
          }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...