在Node.JS

时间:2017-10-08 02:16:42

标签: javascript node.js mongodb

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

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

路由器对象是传统的Express路由器,但 distinctArtistsArray 是MongoDB数据库中所有艺术家的String数组。我有一个在后台运行的异步函数,它不时地填充 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 控制器中可用?

1 个答案:

答案 0 :(得分:1)

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

  

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

因此,如果您想要更新的值,则不需要再次require该文件,并且可以将其移出请求回调。

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

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

然后

console.log(ArtworkSearch.artists())

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

module.exports.artists = distinctArtistsArray

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