使用pg-promise格式化JSON输出,将外键封装为对象

时间:2016-08-15 00:27:25

标签: json node.js postgresql angular pg-promise

我正在使用Node.JS和PostgreSQL构建一个非常简单的REST平台,使用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"}

然而,这不是我想要的格式。我想在'ticket'对象中封装'persons'对象,替换外键如下:

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

我之所以这样做是因为我可以轻松地从Angular2服务中使用此API并将票证和人员转换为我的组件中的对象。但是我完全不知道如何去做这个并且pg-promise文档没有帮助。

在过去的一年里,我一直使用Django进行网络编程,但自从我切换到Node.JS后,我感觉自己就像一个完整的新手。有人可以帮我指点或指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

pg-promise直接执行查询,并提供与服务器发送的数据完全相同的数据。它没有进行任何额外的转换,因为它不是ORM。

如果您希望您的数据按照您描述的方式进行转换,那么就自己动手,因为它很简单。

如果查询级别存在分离,即如果存在父查询+子查询而不是单个连接查询,则pg-promise能够以您描述的方式转换数据的唯一方式。有关此类示例,请参阅Get a parents + children tree with pg-promise

然而,这不是我建议的,因为单个连接查询效率更高。收到后,您应该简单地转换数据。

当然,如果您决定采用这种方式,那么可以为您做一些ORM-s,这将是一种非常不同的方法,远离直接查询执行。