尝试通过 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 导入所有 item1 和 item2 时,如下所示:


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

我得到了包含 object 的数组,但 item1 和 item 2 未定义。我似乎不明白问题是什么。我知道我可以在导出时使用匿名函数并以这种方式获取数据,但我宁愿通过尝试按元素索引访问数组中的数据来实现。非常感谢所有的帮助!


一只名叫tom的猫
浏览 34回答 1
1回答

倚天杖

我得到了带有对象的数组鉴于该代码,您不应该这样做。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;
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript