【问题标题】:exporting multiple objects in Node.JS在 Node.JS 中导出多个对象
【发布时间】:2017-10-08 10:41:28
【问题描述】:

我正在开发一个 MEAN 堆栈项目,并尝试将一组变量从一个控制器传递到另一个控制器。我目前的方法是为我的**artworks.js** 控制器文件导出多个对象:

module.exports = {
  Router: router,
  artists: distinctArtistsArray
}

路由器对象是一个传统的 Express 路由器,但 distinctArtistsArray 是我的 MongoDB 数据库中所有艺术家的字符串数组。我有一个在后台运行的异步函数,它时不时地填充 distinctArtistsArray。然后将该数组传递给其他地方编写的一些其他函数,以便在幕后执行一些 NLP 任务。

我希望另一个控制器也可以访问这些变量,因为我不想通过对艺术家信息进行重复的异步查询来给我的 MongoDB 施加过多的负载。这是我的另一个控制器 (complete.js):

router.get("/", (req, res) => {
    var ArtworkSearch = require('../controllers/artworks.js');
    console.log(ArtworkSearch.artists)
});

我已将 require('../controllers/artworks/js') 放在回调函数中,因为我想在每次请求到达 /complete 端点时不断重新导入值。

但是,在我的控制台中,我收到了一个空数组 ([]),这是我将 distinctArtistsArray 初始化为的数组。仅供参考,我采用了与此SO post 中关于类似主题的公认答案相同的确切方法。

如何让我的艺术家列表在 complete.js 控制器中可用?

【问题讨论】:

  • 如果distinctArtistsArray最初是空的,那么它是如何获取值的。您无需重新导入即可查看该属性的最新值。请记住,模块已缓存,因此重新导入不会再次运行您的模块。它只是从第一次返回缓存的模块。
  • 谢谢。我不知道模块缓存在 Node 中!

标签: javascript node.js mongodb


【解决方案1】:

问题是 NodeJS 中所需的模块被缓存了。来自 Node 的文档:

模块在第一次加载后被缓存。这意味着(除其他外)每次调用 require('foo') 都将返回完全相同的对象,如果它会解析为同一个文件。

所以如果你想要更新的值,你不需要再次require文件,你可以把它移到请求回调之外。

您应该导出一个返回数组的函数,如下所示:

module.exports = {
  Router: router,
  artists: function () {
    return distinctArtistsArray
  }
}

然后

console.log(ArtworkSearch.artists())

您还可以手动更新您的代码中导出的值,通过运行定期更新distinctArtistsArray

module.exports.artists = distinctArtistsArray

每次更新distinctArtistsArray时都需要这样做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多