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

我正在使用Node.JS和PostgreSQL构build一个非常简单的REST平台,使用pg-promise来访问数据库。 我的目标是创build一个令人难以置信的简单的票务系统与用户和票据。 在这一点上,我只是想能够查询服务器的所有票的列表。

我的数据库由两个表格组成,格式如下:

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"} 

但是,这不是我想要的格式。 我想封装'tickets'对象中的'persons'对象,replace外键如下:

 {"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进行networking编程,但是由于我切换到Node.JS,我觉得自己是一个完全的新手。 有人可以帮我一把,还是指向正确的方向?

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

如果你希望你的数据按照你描述的方式进行改变,那么就自己动手吧,因为它是微不足道的。

pg-promise的唯一方法就是能够按照你描述的方式转换数据,如果在查询层次上有分离的话,也就是说如果有一个父查询+子查询而不是单个的连接查询的话。 对于这种示例,请参阅使用pg-promise获取父母+子女树 。

然而,这不是我在这里build议的,因为单个连接查询更有效率。 一旦你收到数据,你应该简单地转换数据。

当然,有些ORM-s可以为你做,如果你决定这样做,这将是一个非常不同的方法,而不是直接的查询执行。