2

我正在使用 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"}

然而,这不是我想要的格式。我想将 '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 后,我感觉自己完全是个新手。有人可以帮我一把或指出我正确的方向吗?

4

1 回答 1

1

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

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

pg-promise能够以您描述的方式转换数据的唯一方法是,如果查询级别存在分离,即如果有父查询+子查询而不是单个连接查询。对于这种示例,请参阅使用 pg-promise 获取父母 + 孩子树

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

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

于 2016-08-15T08:06:48.833 回答