我正在使用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后,我感觉自己就像一个完整的新手。有人可以帮我指点或指出我正确的方向吗?
答案 0 :(得分:1)
pg-promise直接执行查询,并提供与服务器发送的数据完全相同的数据。它没有进行任何额外的转换,因为它不是ORM。
如果您希望您的数据按照您描述的方式进行转换,那么就自己动手,因为它很简单。
如果查询级别存在分离,即如果存在父查询+子查询而不是单个连接查询,则pg-promise能够以您描述的方式转换数据的唯一方式。有关此类示例,请参阅Get a parents + children tree with pg-promise。
然而,这不是我建议的,因为单个连接查询效率更高。收到后,您应该简单地转换数据。
当然,如果您决定采用这种方式,那么可以为您做一些ORM-s,这将是一种非常不同的方法,远离直接查询执行。