簡體   English   中英

NestJS (NodeJS) client.query 運行 3 次,結果為空

[英]NestJS (NodeJS) client.query running 3 times and result is empty

我只是潛入 NestJS(和承諾),並在我使用單個client.query時讓一切正常。 由於 Postgres 不能使用 params 進行菊花鏈查詢,我需要在 0 到 n 次的任何地方運行client.query ,我試圖用一個簡單的 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 中都有描述,但我無法理解如何在這種特殊情況下修復它。 已閱讀所有內容如何從異步調用返回響應?

至於第二個問題,您可以通過以下方式使用 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;
        }
    });
}

對於第一個問題,我不太確定是什么導致了這種行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM