javascript - NestJS (NodeJS) client.query 运行 3 次,结果为空
问题描述
我只是潜入 NestJS(和承诺),当我使用一个单一client.query
的 . 由于 Postgres 无法使用参数进行菊花链查询,我需要在client.query
任何地方运行 0 到 n 次,我试图通过一个简单的 JS 循环来完成。
我到处搜索,但无法找到如何使用循环执行此操作(我可能正在搜索错误的术语......)
getQueryResult({
queries,
database,
values = []
}: {
queries: string[];
database: string;
values?: string[];
}): Promise<any> {
// Connect to remote Postgres via local SSH tunnel
const pool = new Pool({
user: '',
host: 'localhost',
database: database,
password: '',
port: 63333
});
const queryResult = [];
return pool.connect().then(client => { // <--THIS LINE RUNS 3 TIMES
for (let i = 0; i < queries.length; i++) {
client
.query(queries[i], values)
.then(res => {
client.release();
queryResult.push(res['rows']);
console.log('queryResult0', queryResult, queries.length);
})
.catch(err => {
client.release();
console.log(err);
});
}
console.log('queryResult', queryResult);
return queryResult;
});
}
我有两个挑战。
- 何时
queries
包含一个查询:查询触发 3 次并产生以下结果
queryResult []
queryResult0 [
[
{ ... correct results ... }
]
] 1
queryResult0 [
[
{ ... correct results ... }
]
] 1
queryResult0 [
[
{ ... correct results ... }
]
] 1
1
数组的(正确)长度在哪里。
- 最后一个返回
queryResult
只是空数组 - 由于在循环运行之前返回,我猜是因为它在循环之前显示 --^ 。整个 SO 都描述了超出范围/异步,但我无法在这种特殊情况下解决如何修复它。已阅读所有这些如何从异步调用返回响应?
解决方案
至于第二个问题,您可以通过以下方式使用 async-await 进行多个异步调用:
getQueryResult({
queries,
database,
values = []
}: {
queries: string[];
database: string;
values?: string[];
}): Promise<any> {
// Connect to remote Postgres via local SSH tunnel
const pool = new Pool({
user: '',
host: 'localhost',
database: database,
password: '',
port: 63333
});
const queryResult = [];
return pool.connect().then(async (client) => {
try{
for (let i = 0; i < queries.length; i++) {
let res=await client.query(queries[i], values)
if(res){
client.release();
queryResult.push(res['rows']);
console.log('queryResult0', queryResult, queries.length);
}
}
console.log('queryResult', queryResult);
return queryResult;
}
catch(error){
return error;
}
});
}
对于第一个问题,我不太确定是什么导致了这种行为。
推荐阅读
- windows - (win10) Ndis 微型端口驱动程序,在 MpInitialize 之前未调用 EvtDeviceAdd
- django - 如何在 Django 模板标签中执行异常处理(try-catch)?
- c# - Swagger Auth 使用用户名和密码 .netcore 2
- kotlin - 如何将类类型传递给kotlin中的函数?
- python - PySnmp:无法设置 OID 的值(“str”对象没有属性“getTagSet”)
- c# - 尽管计数工作正常,但组的不同计数失败
- mysql - Sequelize 连接表不重新调整附加字段
- ruby - 带有 jemalloc 的 Ruby 2.6.5
- asp.net-core-webapi - 在 asp.net 核心 API 中打开 db2connection 时出现异常
- twig - for循环开始标记内的Twig If语句