提问者:小点点

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


最初,我在文件中有一个空数组,但在代码执行期间,我从数据库中获取数据并将数据推送到数组中。我的代码如下所示:

items.js

const 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导入all,item1和item2时,如下所示:

const { all, item1, item2 } = require('../data/items');

我以object作为all获得数组,但item1和Item2未定义。我似乎不明白问题是什么。我知道在导出数据时可以使用一个nonumous函数,并以这种方式获取数据,但我更愿意通过尝试按元素的索引访问数组中的数据。非常感谢所有的帮助!


共1个答案

匿名用户

我得到了数组,object as all

考虑到那个代码,你不应该。不过,您可能会在某个时候调用init

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

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

您可以在尝试读取item1属性时用获取item1的当前值的getter替换item1,但这可能仍然会导致争用条件。

更好的解决方案可能是导出一个promise,一旦提取完成,该promise就作为对象进行评估。

显然,您需要对导出的值使用then()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;