javascript - 即使使用 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。
解决方案
insertOrg
不返回Promise
要await
编辑的。编写它以便它返回一个可以等待的 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);
});
});
}
推荐阅读
- magento-1.8 - Magento - 如何将值从模板传递到 js 文件?
- php - 计划的 Cron 作业未在 Godaddy 共享主机中运行
- html - 按钮内部跨度未注册点击
- angular - 递归调用 http.post 并在最后一次迭代中返回 observable
- c# - 在安装期间获取 MSI 名称
- oracle - Win7 上单个 Oracle 数据库上的多个 Oracle 实例
- php - 自定义帖子类型存档页面 WordPress 的“编辑”选项
- angular - @angular/cdk/overlay 全局和居中位置不起作用
- java - 使用 HTTPS 进行 Spring Boot 测试
- kotlin - 如何使用 TornadoFX 改进我的代码以在表格中显示数据数组?