Получение ответа из базы данных в виде массива вместо отдельных объектов - PullRequest
0 голосов
/ 20 февраля 2019

Я хочу получить ответ от функции обратного вызова базы данных в виде массива, а не отдельных объектов.Проблема в том, что при текущей настройке Express выдает ошибку «Заголовки уже установлены».

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

Файл: database_connection.js

exports.connection = {
query: function () {
    var queryArgs = Array.prototype.slice.call(arguments),
        events = [],
        eventNameIndex = {};

    pool.getConnection(function (err, conn) {
        if (err) {
            if (eventNameIndex.error) {
                eventNameIndex.error();
            }
        }
        if (conn) {
            var q = conn.query.apply(conn, queryArgs);
            q.on('end', function () {
                conn.release();
            });
            console.log(events);
            events.forEach(function (args) {
                q.on.apply(q, args);
            });
        }
    });

    return {
        on: function (eventName, callback) {
            events.push(Array.prototype.slice.call(arguments));
            eventNameIndex[eventName] = callback;
            return this;
        }
    };
}};

Я использую это так:

Файл: database_operations.js

exports.streepjes = function(){
  return {
    getByUserID: function(userid, callback_streepjes){
      sqlSelect = sqlQuery.select();
      //QUERY:
      let command = sqlSelect.from('steepjes').select('*').where({USERID: userid}).build();
      database.connection.query(command).on('result', function(result){
        console.log("ANOTHER ONE");
        console.log(result);
        return callback_streepjes(result);
      }).on('error', function(err){
        console.error(err);
      });
    }
  }
};

И я использую эти функции в функции экспресс-маршрутизатора:

router.get('/getStrepenByUserID', function(req, res) {
  database_operations.streepjes().getByUserID(req.query.userid, function(response){
    res.json(response);
  });
});

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

Определенный вопрос:

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

Заранее спасибо!

Редактировать:

Я использую MySQL и функции делаютработает правильно, когда вы получаете только один элемент, он падает, когда отвечает несколькими строками пакетов

Предварительный ответ:

См. мой ответ

1 Ответ

0 голосов
/ 20 февраля 2019

Сделано это, изменив функцию в database_operations следующим образом:

exports.streepjes = function(){
  return {
    getByUserID: function(userid, callback_streepjes){
      sqlSelect = sqlQuery.select();
      //QUERY:
      let command = sqlSelect.from('steepjes').select('*').where({USERID: userid}).build();
      let output = [];
      database.connection.query(command).on('result', function(result){
        output.push(result);
      }).on('error', function(err){
        console.error(err);
      }).on('end', function(){
        return callback_streepjes(output);
      });
    }
  }
};

По существу, помещая каждый элемент в массив, называемый output, и затем возвращая его только после того, как сработало событие 'end'.Если есть лучший способ исправить это, пожалуйста, дайте мне знать!

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