簡體   English   中英

來自帶有承諾的數據庫的結果在 nodeJS 中沒有正確返回

[英]Result from database with promise is not returned properly in nodeJS

我正在嘗試從數據庫“neo4j”獲取數據

我已經創建了一個控制器和一個模型。 控制器調用模型,模型從數據庫中獲取數據。

控制器是一個異步函數,它正在等待模型函數提供數據。

模型是從數據庫中獲取數據的承諾。

模型中的結果是正確的,但控制器中的結果未定義。 請幫忙。

    var neo4j = require("neo4j-driver").v1;

    var driver = neo4j.driver(
      "bolt://localhost:7687",
      neo4j.auth.basic("neo4j", "password")
    );
    var session = driver.session();

    function get4fomDb() {
      try {
        resultPromise = session.run("Match(n) return n");
        resultPromise.then(result => {
          session.close();
          driver.close();
          console.log("MODEL RESULT : ", result);
          return result;
        });
        resultPromise.catch(function(err) {
          console.log("===========ERROR in DB=====================");
          console.log("ERROR : ", err);
          console.log("=========================================");
          return err;
        });
      } catch (err) {
        console.log("Error : ", err);
        return "ERROR in CATCh";
        // res.send("404 : Page not found ")
      } finally {
      }
    }

    async function controller() {
      let result = await get4fomDb();
      console.log("CONTROLLER RESULT : ", result);
    }

    controller();

輸出 :

[nodemon] starting `node .\app.js`
CONTROLLER RESULT :  undefined
MODEL RESULT :  { records:
   [ Record {
       keys: [Array],
       length: 1,
       _fields: [Array],
       _fieldLookup: [Object] },
     Record {
       keys: [Array],
       length: 1,
       _fields: [Array],
       _fieldLookup: [Object] } ],
  summary:
   ResultSummary {
     statement: { text: 'Match(n) return n', parameters: {} },
     statementType: 'r',
     counters: StatementStatistics { _stats: [Object] },
     updateStatistics: StatementStatistics { _stats: [Object] },
     plan: false,
     profile: false,
     notifications: [],
     server:
      ServerInfo { address: 'localhost:7687', version: 'Neo4j/3.5.12' },
     resultConsumedAfter: Integer { low: 0, high: 0 },
     resultAvailableAfter: Integer { low: 0, high: 0 } } }

你並沒有真正從get4fomDb返回承諾(因為承諾是在那里用then/catch )。

如果這個session.run('Match(n) return n'); 是一個promise只需從get4fomDb返回它並在get4fomDb contoller()使用try/catchawait 這也使代碼更具可讀性。

此外,不推薦混合使用async/awaitpromise.then().catch()模式,堅持使用一種。

function get4fomDb() {
  return session.run("Match(n) return n");
}

async function controller() {
  try {
    let result = await get4fomDb();
    console.log("Promise results::", result);
  } catch (error) {
    console.error("Error from db promise::", error);
  } finally {
    session.close();
    driver.close();
  }
}

controller();

您是否嘗試刪除了finally代碼塊? 似乎它返回的是undefined,因為在finally中執行的操作實際上什么都不做。

我能夠在同一個文件中成功關閉會話:

這是模態的代碼:

exports.registerNew = (input) => {


    let query = "CREATE n Return (n)";


    var session = driver.session();
    return session.run(query).then(result => {
        session.close()
        driver.close()
        return result
    })
}

暫無
暫無

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

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