Вложенный запрос Nodejs, ответ приходит только из последней таблицы, данные стартовой таблицы показывают нулевое значение - PullRequest
0 голосов
/ 01 июля 2019
var connection = require('./../config');
var request = require("request");
module.exports.travelsummary = function (req, res, callback) {
    var id = req.body.id;
    var start_date = req.body.start_date;
    var end_date = req.body.end_date;
    var full_data = [];
    if (id == undefined) {
        res.json({
            message: 'Please enter user id'
        });
        return;
    }
    var query1 = `SELECT imei FROM gs_user_objects WHERE user_id = ${id}`;
    connection.query(query1, function (error, result1, fields) {
        if (!error) {
            for (i = 0; i < result1.length; i++) {
                var table_name = 'gs_object_data_' + result1[i].imei;
                console.log(table_name);
                var query2 = `SELECT * FROM ${table_name} WHERE dt_server BETWEEN '${start_date}' AND '${end_date}'`;
                //var qry3 = `SELECT * FROM gs_object_data_358899059206311 WHERE dt_server BETWEEN '2019-05-27 06:06:57' AND '2019-05-28 06:06:57'`
                connection.query(query2, function (error, result2) {
                    full_data[i] = (result2);
                    console.log(full_data);
                    console.log(query2)
                    if (i == result1.length && !error && result2.length > 0) {
                        res.json({
                            message: 'data fetch successfuly',
                            data: full_data
                        })
                    }
                });
            }
        }

    });
};  

из первого ответа на запрос принимает в качестве входных данных внутренний запрос, затем результат отправляется в ответе, но данные получают только последнюю таблицу.

как я могу получить данные каждой таблицы в отдельном массиве?

OUTPUT-

{
    "message": "data fetch successfully",
    "data": [
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        null,
        [
            {
                "dt_server": "2019-05-27T00:42:16.000Z",
                "dt_tracker": "2019-05-27T00:42:16.000Z",
                "lat": 18.601397,
                "lng": 73.932204,
                "altitude": 0,
                "angle": 0,
                "speed": 0,
                "params": "{\"gpslev\":\"5\",\"pump\":\"1\",\"track\":\"1\",\"bats\":\"1\",\"acc\":\"0\",\"defense\":\"0\",\"batl\":\"6\"}",
                "ignition": "",
                "power": "",
                "AC": "",
                "distance": "",
                "total_distance": ""
            },
            {
                "dt_server": "2019-05-27T00:49:46.000Z",
                "dt_tracker": "2019-05-27T00:49:46.000Z",
                "lat": 18.601397,
                "lng": 73.932204,
                "altitude": 0,
                "angle": 0,
                "speed": 0,
                "params": "{\"gpslev\":\"5\",\"pump\":\"1\",\"track\":\"1\",\"bats\":\"1\",\"acc\":\"0\",\"defense\":\"0\",\"batl\":\"6\"}",
                "ignition": "",
                "power": "",
                "AC": "",
                "distance": "",
                "total_distance": ""
            },
            {
                "dt_server": "2019-05-27T01:08:03.000Z",
                "dt_tracker": "2019-05-27T01:08:03.000Z",
                "lat": 18.601397,
                "lng": 73.932204,
                "altitude": 0,
                "angle": 0,
                "speed": 0,
                "params": "{\"gpslev\":\"5\",\"pump\":\"1\",\"track\":\"1\",\"bats\":\"1\",\"acc\":\"0\",\"defense\":\"0\",\"batl\":\"6\"}",
                "ignition": "",
                "power": "",
                "AC": "",
                "distance": "",
                "total_distance": ""
            },
            {
                "dt_server": "2019-05-27T01:17:50.000Z",
                "dt_tracker": "2019-05-27T01:17:50.000Z",
                "lat": 18.601397,
                "lng": 73.932204,
                "altitude": 0,
                "angle": 0,
                "speed": 0,
                "params": "{\"gpslev\":\"5\",\"pump\":\"1\",\"track\":\"1\",\"bats\":\"1\",\"acc\":\"0\",\"defense\":\"0\",\"batl\":\"6\"}",
                "ignition": "",
                "power": "",
                "AC": "",
                "distance": "",
                "total_distance": ""
            },
            {
                "dt_server": "2019-05-27T01:25:11.000Z",
                "dt_tracker": "2019-05-27T01:25:11.000Z",
                "lat": 18.601397,
                "lng": 73.932204,
                "altitude": 0,
                "angle": 0,
                "speed": 0,
                "params": "{\"gpslev\":\"5\",\"pump\":\"1\",\"track\":\"1\",\"bats\":\"1\",\"acc\":\"0\",\"defense\":\"0\",\"batl\":\"6\"}",
                "ignition": "",
                "power": "",
                "AC": "",
                "distance": "",
                "total_distance": ""
            },
            {
                "dt_server": "2019-05-27T01:32:31.000Z",
                "dt_tracker": "2019-05-27T01:32:31.000Z",
                "lat": 18.601397,
                "lng": 73.932204,
                "altitude": 0,
                "angle": 0,
                "speed": 0,
                "params": "{\"gpslev\":\"5\",\"pump\":\"1\",\"track\":\"1\",\"bats\":\"1\",\"acc\":\"0\",\"defense\":\"0\",\"batl\":\"6\"}",
                "ignition": "",
                "power": "",
                "AC": "",
                "distance": "",
                "total_distance": ""
            }
        ]
    ]
}

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

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Братан, тебе нужно использовать async-await или обещать

Например: код,

   var connection = require('./../config');
var request = require("request");
module.exports.travelsummary = async function (req, res, callback) {
    try {
        var id = req.body.id;
        var start_date = req.body.start_date;
        var end_date = req.body.end_date;
        var full_data = [];
        if (id == undefined) {
            res.json({
                message: 'Please enter user id'
            });
            return;
        }
        let query1 = `SELECT imei FROM gs_user_objects WHERE user_id = ${id}`;
        let result1 = await connection.query(query1);
        if (result1 && result1.length) {
            await Promise.all(result1.map((item, i) => {
                let table_name = 'gs_object_data_' + item.imei;
                let query2 = `SELECT * FROM ${table_name} WHERE dt_server BETWEEN '${start_date}' AND '${end_date}'`;
                let result2 = await connection.query(query2);
                full_data.push(result2);
            }))
            res.json({
                message: 'data fetch successfuly',
                data: full_data
            })
        } else
            return "empty"

    } catch (error) {
        return error
    }
};  

Чтобы использовать async-await, вам нужно использовать обещание-MySQL npm для создания соединения. Это просто обертка.

0 голосов
/ 01 июля 2019

Ответ от вашей базы данных на последний запрос / таблицу получен до ответа на предыдущие запросы. Лучше использовать обещание: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

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