首页 > 解决方案 > 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;
        });
    }

我有两个挑战。

  1. 何时queries包含一个查询:查询触发 3 次并产生以下结果
queryResult []
queryResult0 [
 [
   { ... correct results ... }
 ]
] 1
queryResult0 [
 [
   { ... correct results ... }
 ]
] 1
queryResult0 [
 [
   { ... correct results ... }
 ]
] 1

1数组的(正确)长度在哪里。

  1. 最后一个返回queryResult只是空数组 - 由于在循环运行之前返回,我猜是因为它在循环之前显示 --^ 。整个 SO 都描述了超出范围/异步,但我无法在这种特殊情况下解决如何修复它。已阅读所有这些如何从异步调用返回响应?

标签: javascriptnode.jsnestjs

解决方案


至于第二个问题,您可以通过以下方式使用 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;
        }
    });
}

对于第一个问题,我不太确定是什么导致了这种行为。


推荐阅读