为了账号安全,请及时绑定邮箱和手机立即绑定

尝试通过 Node.js 中的元素索引从数组导出对象时,值未定义

尝试通过 Node.js 中的元素索引从数组导出对象时,值未定义

一只名叫tom的猫 2024-01-18 10:52:17
最初,我在文件内有一个空数组,但在代码执行期间,我从数据库获取数据并将数据推送到数组中。我的代码如下所示:items.jsconst items = [];const init = (connection) => {  return connection.collection('collectionName')    .aggregate([{      ....        }])    .toArray()    .then(result => {      items.push(...result);      return result;    });     };module.exports = {  init,  all: items,  item1: items[0],  item2: roles[1],};当我尝试在不同的文件中使用 require 导入所有 item1 和 item2 时,如下所示:const { all, item1, item2 } = require('../data/items');我得到了包含 object 的数组,但 item1 和 item 2 未定义。我似乎不明白问题是什么。我知道我可以在导出时使用匿名函数并以这种方式获取数据,但我宁愿通过尝试按元素索引访问数组中的数据来实现。非常感谢所有的帮助!
查看完整描述

1 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

我得到了带有对象的数组

鉴于该代码,您不应该这样做。init不过,想必您会在某个时候打电话。

但 item1 和 item 2 未定义。我似乎不明白问题是什么。

当您读取items[0]将其分配给要导出的对象时,异步函数尚未完成,因此该数组仍然是一个空数组。

可以item1用一个getter来替换,该 getter 在您尝试读取该属性时获取当前值,但这可能仍然会导致竞争条件。items[0]item1

更好的解决方案可能是导出一个承诺,一旦获取完成,该承诺将被评估为对象。

显然,您需要在导出的值上使用then()or 。await您不会直接从import.

const init = async (connection) => {

    const items = await connection.collection('collectionName')

    .aggregate([{

      ....

    

    }])

    .toArray()

    return {

        all: items,

        item1: items[0],

        item2: roles[1], // whatever roles is

    }

};


module.exports = init();


const promise = require('../data/items');

const { all, item1, item2 } = await promise;


查看完整回答
反对 回复 2024-01-18
  • 1 回答
  • 0 关注
  • 29 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信