首页 > 解决方案 > 如何使用node js从.then返回neo4j查询结果

问题描述

我需要使用 Node JS 的 Neo4j 驱动程序来获取返回的数据。我的问题是,我可以在 .then 调用的控制台上打印 'online' 的值,但我似乎无法在该部分之外访问它 - 我尝试返回record.get('onl'),将其分配给预定义函数外部的变量,但没有任何作用 - 例如,如果我尝试online在此代码段的最后一行打印 out 的值,我得到的结果就是Promise { <pending> }. 我想我没有正确处理承诺,我查阅了很多教程和示例,但我无法解决。那么:我如何将返回的数据分配(record.get('onl'))var online并获得实际结果而不是承诺?提前致谢 :)

var online = session.run(cyp1, param).then(results => {
                return  results.records.map(record =>{
                    console.log(record.get('onl'))
                    return record.get('onl')                    
            })
            }).then(()=>{
                session.close()
        });
console.log(online)

标签: javascriptnode.jsneo4j

解决方案


目前,您将 var 分配online为“承诺链”而不是“已解决的承诺”。您可以使用Async/Await这将允许您以同步方式编写异步代码。

async function getRecords(){
    const records = await session.run(cyp1, param);

    return records.map(record => record.get('onl'))
}

const online = await getRecords();

使用 try/catch/finally

try {
   const online = await getRecords();
} catch (error) {
   // do something
} finally {
   await session.close()
}

如果您想继续使用.then() 您需要使用“Promise Chaining”并传递值“Down the chain”,这会导致复杂的“Callback”/“Promise Chain”地狱。

session.run(cyp1, param).then(results => {
    return results.records.map(record => record.get('onl'))
}).then((online)=> {
    console.log(online)
}).catch(() => {
    // do something
}).finally(() => {
    session.close()
});

推荐阅读