我正在研究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
控制器中可用?
答案 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
时都需要这样做。