2017-10-08 89 views
0

我正在处理一个MEAN堆栈项目,并试图将一组变量从一个控制器传递到另一个控制器。我目前的做法是导出多个对象为我**artworks.js**控制器文件:在Node.JS中导出多个对象

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

路由器对象是传统的快递路由器,但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控制器?

+1

如果'distinctArtistsArray'最初是空的,那么它是如何得到一个值的。您无需重新导入即可查看该房产的最新价值。请记住,模块已被缓存,因此重新导入不会再次运行您的模块。它只是从第一次返回缓存模块。 – jfriend00

+0

谢谢。我不知道模块缓存在Node中! –

回答

1

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

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

因此,如果需要更新的值,则不需要require文件,并且您可以将其移至请求回调之外。

而应该导出返回数组的函数,就像这样:

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

然后

console.log(ArtworkSearch.artists()) 

你也可以手动更新您的代码导出值定期更新distinctArtistsArray通过运行:

module.exports.artists = distinctArtistsArray 

这需要完成前夕ry你更新distinctArtistsArray