即使等待,NodeJS函数也不会等待PostgreSQL数据库调用

时间:2019-07-25 19:10:45

标签: javascript node.js postgresql typescript express

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

路由,(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的数据库中。

1 个答案:

答案 0 :(得分:0)

insertOrg不会返回Promise的{​​{1}}。编写它,以便它返回可以等待的承诺。

await