来自带有承诺的数据库的结果未在nodeJS中正确返回

时间:2019-11-23 11:11:05

标签: javascript node.js neo4j promise

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

我已经创建了一个控制器和一个模型。 控制器调用模型,然后模型从数据库中获取数据。

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 } } }

2 个答案:

答案 0 :(得分:2)

您并没有真正从get4fomDb返回承诺(因为承诺本身是由then/catch处理的。)

如果此 session.run('Match(n) return n'); promise,只需从get4fomDb返回,然后在{{1中使用try/catchawait }}。这也使代码更具可读性。

也不建议使用contoller()async/await的混合模式,请坚持使用。

promise.then().catch()

答案 1 :(得分:0)

我能够在同一文件中成功关闭会话:

这是模态的代码:

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
    })
}