Форматирование вывода JSON с использованием pg-promise, инкапсуляция внешних ключей в виде объектов

Я создаю очень простую платформу REST, используя Node.JS и PostgreSQL, используя pg-promise для доступа к базе данных. Моя цель — создать невероятно простую систему продажи билетов с пользователями и билетами. На данный момент я просто хочу запросить у сервера список всех билетов.

Моя база данных состоит из двух таблиц в следующем формате:

CREATE TABLE people (
  ID SERIAL PRIMARY KEY,
  NAME VARCHAR(128)
);

CREATE TABLE tickets (
  ID SERIAL PRIMARY KEY,
  SUBMITTED_BY int4 REFERENCES people(ID),
  TITLE VARCHAR(128)

Как вы можете видеть, есть единственный внешний ключ, указывающий билеты на людей. Я заполнил свою базу данных следующими данными:

coop=> SELECT * FROM people;
 id |   name   
----+----------
  1 | John Doe
(1 row)

coop=> SELECT * FROM tickets;
 id | submitted_by |      title       
----+--------------+------------------
  1 |            1 | My first ticket!
(1 row)

И я использую pg-promise со следующей функцией запроса для отображения ответа JSON:

// GET ALL query function
function getAllTickets(req, res, next) {
  db.any('select * from tickets left join people on tickets.submitted_by = people.id;')
    .then(function (data) {
      res.status(200)
        .json({
          status: 'success',
          data: data,
          message: 'Retrieved ALL tickets'
        });
    })
    .catch(function (err) {
      return next(err);
    });
}

Функция работает, я могу получить вывод JSON в следующем формате:

:: GET /api/tickets
    {"status":"success","data":[{"id":1,"submitted_by":1,"title":"My first ticket!","name":"John Doe"}],"message":"Retrieved ALL tickets"}

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

{"status":"success","data":[{"id":1,submitted_by: {"id": 1, "name":"John Doe"},"title":"My first ticket!"}],"message":"Retrieved ALL tickets"}

Причина, по которой я хочу сделать это, заключается в том, чтобы я мог легко использовать этот API из службы Angular2 и переводить как билет, так и человека в объект в моем компоненте. Однако я совершенно не знаю, как это сделать, и документация pg-promise не помогла.

Я занимался веб-программированием с Django в течение прошлого года, но с тех пор, как я перешел на Node.JS, я чувствую себя полным новичком. Может ли кто-нибудь предложить мне руку или указать мне правильное направление?


person Fox    schedule 15.08.2016    source источник


Ответы (1)


pg-promise выполняет запросы напрямую и предоставляет данные точно так же, как они отправляются сервером . Он не выполняет никаких дополнительных преобразований, так как это не ORM.

Если вы хотите, чтобы ваши данные преобразовывались так, как вы описали, просто сделайте это сами, ибо это тривиально.

Единственный способ, которым pg-promise сможет преобразовывать данные так, как вы описали, если бы было разделение на уровне запроса, т.е. если бы был родительский запрос + дочерний запрос вместо одного запроса на соединение. Для такого примера см. Получить дерево родителей + детей с помощью pg-promise .

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

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

person vitaly-t    schedule 15.08.2016