使用 pg-promise 格式化 JSON 输出,将外键封装为对象
Formatting JSON output using pg-promise, encapsulating foreign keys as objects
我正在使用 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)
可以看到有单外键指向tickets的人。我用以下数据填充了我的数据库:
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"}
然而这不是我想要的格式。我想把'persons'对象封装在'tickets'对象里面,替换外键如下:
{"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 我觉得自己完全是个新手。有人可以帮助我或指出正确的方向吗?
pg-promise 直接执行查询,并提供与服务器发送的数据完全相同的数据。它不做任何额外的转换,因为它不是 ORM。
如果您希望您的数据按照您描述的方式进行转换,那么就自己动手吧,因为这很简单。
唯一的方法 pg-promise 能够按照您描述的方式转换数据,如果在查询级别上存在分离,即如果有父查询 + 子查询而不是单个连接询问。对于这种示例,请参见 获取父子树。
然而,这不是我在这里建议的事情,因为单个连接查询的效率要高得多。您应该在收到数据后简单地转换数据。
当然,有一些 ORM 可以为您做这件事,如果您决定采用那种方式,那将是一种非常不同的方法,与直接查询执行不同。
我正在使用 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)
可以看到有单外键指向tickets的人。我用以下数据填充了我的数据库:
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"}
然而这不是我想要的格式。我想把'persons'对象封装在'tickets'对象里面,替换外键如下:
{"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 我觉得自己完全是个新手。有人可以帮助我或指出正确的方向吗?
pg-promise 直接执行查询,并提供与服务器发送的数据完全相同的数据。它不做任何额外的转换,因为它不是 ORM。
如果您希望您的数据按照您描述的方式进行转换,那么就自己动手吧,因为这很简单。
唯一的方法 pg-promise 能够按照您描述的方式转换数据,如果在查询级别上存在分离,即如果有父查询 + 子查询而不是单个连接询问。对于这种示例,请参见
然而,这不是我在这里建议的事情,因为单个连接查询的效率要高得多。您应该在收到数据后简单地转换数据。
当然,有一些 ORM 可以为您做这件事,如果您决定采用那种方式,那将是一种非常不同的方法,与直接查询执行不同。