You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 09:53:13