首页 > 解决方案 > 即使使用 await,NodeJS 函数也不会等待 PostgreSQL 数据库调用

问题描述

我正在尝试将条目递归地添加到数据库中,每个条目都依赖于前一个条目(前一个条目的 ID 将是下一个条目 child_id)。这一切都很好,但我无法让 async/await 正常工作。

Route,(qb 是来自下一个代码块的类实例)

// add orgs to db
router.post('/api/v1/orgs/add', async (req: Request, res: Response) => {
    const { org_name, daughters } = req.body;

    if (!org_name) return res.status(400).json({ err: 'MISSING_NAME' });

    const result = await qb.processRequest(org_name, daughters);

    res.json(result);
});
async processRequest(name: string, daughters?: any) {
    if (daughters) {
        daughters.map(async daughter => {
            return await this.processRequest(daughter.org_name, daughter.daughters);
        });

    }
    await this.insertOrg(name, daughters)
}

protected insertOrg(name: string, children?: number[]) {
    const childParam = children ? `array[${children}]` : 'NULL';

    const query = ` INSERT INTO orgs 
                        (org_name, daughters)
                    VALUES 
                        ('${name}', ${childParam})
                    RETURNING id`;

    pool.query(query, (err, res) => {
        if (err) throw err;

        return res.rows[0].id;
    });
}

示例 POST 正文

{
    "org_name": "Paradise Island",
    "daughters": [
        {
            "org_name": "Banana tree",
            "daughters": [
                {
                    "org_name": "Yellow Banana"
                }
            ]
        }
    ]
}

我的目标是将没有子级的最里面的组织添加到数据库中,其子级为 NULL。这个条目的 ID 将返回给父函数,父函数会将返回的 id 映射到女儿数组,并且本身会添加到数据库中,包括孩子的 id。

标签: javascriptnode.jspostgresqltypescriptexpress

解决方案


insertOrg不返回Promiseawait编辑的。编写它以便它返回一个可以等待的 Promise。

protected insertOrg(name: string, children ? : number[]) {
  return new Promise((resolve, reject) => {
    const childParam = children ? `array[${children}]` : 'NULL';

    const query = ` INSERT INTO orgs 
                    (org_name, daughters)
                    VALUES 
                    ('${name}', ${childParam})
                    RETURNING id`;

    pool.query(query, (err, res) => {
      if (err) return reject(err);
      resolve(res.rows[0].id);
    });
  });
}

推荐阅读