使用 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 可以为您做这件事,如果您决定采用那种方式,那将是一种非常不同的方法,与直接查询执行不同。