我正在使用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,并将ticket和person都转换为组件中的对象。但是我完全不知道如何去做这一点和pg承诺文件没有帮助。
在过去的一年里,我一直在Django做web编程,但是自从我切换到Node.JS之后,我觉得自己完全是个新手。有人能帮我个忙或指点我正确的方向吗?

最佳答案

pg-promise直接执行查询,并提供与服务器发送的数据完全相同的数据。它不做任何额外的转换,因为它不是ORM。
如果你想按照你描述的方式转换你的数据,那就自己做吧,因为它是微不足道的。
如果在查询级别上存在分离,即如果存在父查询+子查询而不是单个连接查询,那么pg-promise唯一的方法就是按照您描述的方式转换数据。有关此类示例,请参见Get a parents + children tree with pg-promise
不过,这不是我在这里建议的,因为一个连接查询更有效。一旦接收到数据,就应该简单地对其进行转换。
当然,还有一些ORM-s可以为您做到这一点,如果您决定这样做,这将是一个非常不同的方法,远离直接的查询执行。

关于json - 使用pg-promise格式化JSON输出,将外键封装为对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38947837/

10-13 03:36