为何调用Neo4j Driver会话后返回的数组显示undefined?
为什么我的Neo4j查询函数返回undefined?
嘿,作为JavaScript新手,碰到异步操作的坑太正常啦!你的代码问题出在异步函数的返回值和执行时机上,我来一步步给你理清楚:
问题根源
你的getIds函数里调用了session.run(),这是一个异步操作——它不会立刻返回数据库查询结果,而是返回一个Promise对象(可以理解为一个“未来会拿到结果的承诺”)。但你现在的函数没有把这个Promise返回出去,所以调用getIds()的时候,函数默认返回undefined。
另外,console.log(imdbIds)是同步执行的,这时候数据库查询还在后台跑,根本没完成,自然拿不到结果。
修正方案
我们需要调整两点:让getIds返回Promise,然后用正确的方式等待异步结果。
方式1:使用.then()链式调用
先修改getIds让它返回Promise链,然后通过.then()来获取结果:
const getIds = () => { // 关键:return整个Promise链 return session.run('MATCH (m :Movie) RETURN m.imdbId LIMIT 10') .then(result => { const ids = []; result.records.forEach(record => ids.push(record._fields[0])); return ids; }) .catch(err => console.log(err)); } // 通过.then()等待异步完成,再打印结果 getIds().then(imdbIds => { console.log(imdbIds); });
方式2:使用async/await(更直观的语法糖)
如果你觉得链式调用有点绕,可以用async/await,这是ES6之后的异步语法糖,写起来更像同步代码:
// 给函数加上async关键字,这样就能在内部用await const getIds = async () => { try { // await会等待Promise完成,直接拿到结果 const result = await session.run('MATCH (m :Movie) RETURN m.imdbId LIMIT 10'); // 用map代替forEach,生成数组更简洁 const ids = result.records.map(record => record._fields[0]); return ids; } catch (err) { console.log(err); } } // 注意:await只能在async函数里用,所以我们包一个立即执行的async函数 (async () => { const imdbIds = await getIds(); console.log(imdbIds); })();
小提示
- 异步操作(比如数据库查询、网络请求)都需要等待结果,不能像同步代码那样直接赋值获取。
- 用
Array.map()代替forEach来生成数组,是JavaScript里更简洁的写法哦~
内容的提问来源于stack exchange,提问作者Aniruth N
相关产品推荐
相关产品推荐

