[英]NodeJS Bluebird promise created in a handler but was not returned from it
[英]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/catch
和await
。 這也使代碼更具可讀性。
此外,不推薦混合使用async/await
或promise.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.