节点Express.js访问variables在不同文件中声明的路由

我目前正在开发一个使用很多路线的网站。 一开始,所有的路由都在同一个文件中实现…为了使事情更加清晰,我决定创build多个文件,以便将路由分开…使用路由器模块。

例如,在我的users.js文件中我有:

var express = require('express'); var router = express.Router(); router.get('/', function(req, res, next) { res.send('respond with a resource'); }); module.exports = router; 

并在我的主要app.js文件中:

 app.use('/users', require('./routes/user'); 

这完美的作品,但事情是,我希望我的“用户”路线访问一些variables已经声明到app.js文件,在app.use(...)之前,

我知道我可以使用requiremodule.exports ,但是一些variables必须在我的app.js中声明,只有一次,我必须从我包含的路由访问它们。

您可以将它们作为configuration对象传递。 另外改变你的路线,到一个返回路线的函数,这样可以带参数。

 module.exports = function (options) { return function (req, res, next) { // do your thing // you have access to options variable as well } } 

而在你的主JS文件中,需要该文件并调用它,并通过所有你需要的。

 app.use('/users', require('./routes/user')({ option1: 'value1', option2: 'value2' })); 

对于数据库连接,模型和其他第三方库等内容,您不需要将它们作为configuration对象传递。 将它们移动到外部文件以及在path文件中require它们是一个很好的做法。 您需要尽可能多地解耦模块。

只要记住, require会加载每个模块一次,剩下的时间,它只是返回以前加载模块的引用。 看看这个问题了解更多信息。

为了获得更全局的访问权限,你需要创build你想要共享global的variables

 //app.js GLOBAL.config = {} 

最好为你的应用程序configuration使用一个单独的文件。 例如

 //config.js module.exports = {logging:true} 

并使其成为您的app.js文件中的全局variables,如下所示

 //app.js GLOBAL.config = require('./config'); 

现在它将在您的路由定义中可用。 例如

 //routes/users.js router.get('/', function(req, res, next) { if(config.logAccess){ var accessTime = new Date(); console.log('access at '+accessTime.toTimeString()); } res.send('respond with a resource'); });