Как отправить объект / массив JavaScript во внешний интерфейс - приложение node.js - PullRequest
2 голосов
/ 16 мая 2019

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

var scoreQuery = "SELECT q1, q2, q3, q4, q5, q6, q7, q8, q1, q2, q3, q4 FROM table WHERE id = user.id";

var scoreArray;

module.exports = function(app, passport){

    app.get('/profile', isLoggedIn, function (req, res) {
        connection.query(scoreQuery, function (err, result, fields) {
                if (err) throw err;
                getData(result);
                console.log(scoreArray);
            }, res.render('profile.ejs', {
                user:req.user,
                data: scoreArray
            })
        );


    });

};

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

Ниже приведен файл public / javascripts / scripts.js, в котором я создаю график.

/*Scripts*/

var quizCategory1 = data.scoreArray.slice(0,7); 
var quizCategory2 = data.scoreArray.slice(8,11);

var cat1Total = totalScore(category1);
var cat2Total = totalScore(category2);


function totalScore(categoryScore){
    return categoryScore = scoreArray.reduce((accum,scoreArray) =>
        {
            const splitValues = scoreArray.split('/');

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


var ctx = document.getElementById("myChart").getContext('2d');
var barTotalCategoryScores = [cat1Total.score, cat2Total.score];

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

var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: labels,
        datasets: barTotalCategoryScores
          }
    }
});

ScoreArray выводит на консоль всякий раз, когда пользователь входит в систему, поэтомуSQL-запрос и функция getData () работают.Но когда я пытаюсь использовать data.scoreArray в моем файле scripts.js, он не работает.

Ответы [ 3 ]

1 голос
/ 17 мая 2019

сервер:


// ... your routes


// + new route
app.get('/profile/:id', (req,res) => {
     let id = req.params.id // e.g /profile/3 -> req.params.id = 3
     let scoreArray;

     // your query (it's very bad to set param in your query like this (injection SQL) )
     let scoreQuery = `SELECT q1, q2, q3, q4, q5, q6, q7, q8, q1, q2, q3, q4 FROM 
     table WHERE id = ${id}`;  // `... ${foo}` => https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Litt%C3%A9raux_gabarits

     connection.query(scoreQuery, function (err, result, fields) {
                if (err) throw err;
                getData(result);
                console.log(scoreArray);
             }, res.status(200).json({
                user:req.user,
                data: scoreArray
            })
        );
 })

// ... your method

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

клиент:

/* code to get data
 let id_test = 1;

  fetch(`http://localhost:<your_node_server_port>/profil/${id_test}`)
  .then(response => response.json())
  .then(json => console.log(json)) // return profil for id 1
*/

// e.g page is loaded
window.onload = () => {
  let id_test = 1;

  fetch(`http://localhost:<your_node_server_port>/profil/${id_test}`)
  .then(response => response.json())
  .then(json => console.log(json)) // return profil for id 1
}
1 голос
/ 16 мая 2019

Добавить новый маршрут:

app.get('/profile/:id', (req,res) => {
    // your_array = query DB with param id (req.params.id) store in your array
    res.status(200).json({data: <your_array>})
})

Затем на вашем клиенте сделать GET запрос на / profile /: id (https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest) при загрузке страницы (window.onload)


Для MySQL вы должны использовать:

0 голосов
/ 17 мая 2019

Спасибо миллиону Сильвен, твое объяснение привело меня на правильный путь.Я сделал следующее ...

//routes.js

    app.get('/profile',  function (req, res) {
        let id = req.user.id;
        getData(id, function (score) {
            res.status(200).render('profile.ejs',{user: req.user, score})
        });
    });

Я поместил свой SQL-оператор в функцию getData() и использовал '?' вместо идентификатора в моем SQL-операторе и отправил параметр id в качестве значения для вставки вметод запроса.Это сработало, и теперь я могу получить объект счета в файле ejs на стороне клиента, используя <?= score.cat1Total.score ?>.

. Моя проблема сейчас все еще пытается использовать score.cat1Total.score в моем public / javascripts / scripts.jsфайл и он не определен ... и я не уверен, как правильно реализовать ваш window.onload() метод

// /public/javascripts/scripts.js 

/* code to get data?
window.onload = () => {
  fetch(`http://localhost:8080/profile)
  .then(response => response.json())
  .then(json => console.log(json)) 
}
*/

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

//This is where I am trying to get score objects values. 
var barTotalCategoryScores = [score.cat1Total.score, cat2Total.score];

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

var myChart = new Chart(ctx, {
    type: 'bar',
    data: {
        labels: labels,
        datasets: barTotalCategoryScores
          }
    }
});

Для справки ниже приведен метод getData(id, callback), который я использовал в маршрутах

// routes.js

function getData(id, callback) {

    let scoreQuery = "SELECT c1q1, c1q2, c1q3, c1q4, c1q5, c1q6, c1q7, c1q8, c2q1, c2q2, c2q3, c2q4 FROM nodejs_login.assessment_score AS a JOIN nodejs_login.users as u ON a.respondent_id = u.user_respondent_id WHERE a.respondent_id = ?";

    connection.query(scoreQuery, [id],function (err, result) {
        if (err) throw err;

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

            let category1 = scoreArray.slice(0,7);
            let category2 = scoreArray.slice(8,11);

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


            //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}
                );
            }
            let categories = {cat1Total, cat2Total};

            callback(categories);

        });
    })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...