javascript - 在 NodeJS 中,带有 Promise 的数据库结果未正确返回

标签 javascript node.js neo4j promise

我正在尝试从数据库“neo4j”获取数据

我已经创建了一个 Controller 和一个模型。 Controller 调用模型,模型从数据库中获取数据。

Controller 是一个异步函数,正在等待模型函数提供数据。

模型是一个从数据库获取数据的 promise 。

模型中的结果是正确的,但 Controller 中的结果未定义。请帮忙。

    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 返回 promise (因为 promise 是通过 then/catch 自行处理的)。

如果这个session.run('Match(n) return n');是一个promise,只需从返回它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();

关于javascript - 在 NodeJS 中,带有 Promise 的数据库结果未正确返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59006994/

相关文章:

javascript - 这个 Javascript 程序的第 6 行让我感到困惑

javascript如何在按其属性排序后获取对象的顺序

javascript - div/段落标签中的最大字符数

javascript - 如何等待AWS takeRole然后继续模块定义

javascript - popoto.js - 预定义密码查询

javascript - ES6模块: export before finishing definitions?

javascript - 如何使用 Nodejs Sequelize 使用 findById 编辑和更新 MySQL 中的特定字段数据?

javascript - Babel/Typescript 别名无法正常工作

java - Neo4j jdbc 驱动程序中的数据库连接池

java - 索引 neo4j 中的现有关系