Node Express.js从单独文件中声明的路由访问变量

Node Express.js access variables from routes declared in separate files

本文关键字:声明 路由 访问 变量 文件 Express js 单独 Node      更新时间:2023-09-26

我目前正在开发一个使用大量路线的网站。一开始,所有的路由都是在同一个文件中实现的。。。为了让事情更清楚,我决定创建多个文件,以便分离路线。。。使用路由器模块。

例如,在我的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');

这非常有效,但问题是我想要我的"用户"路线访问在app.use(...) 之前已声明到app.js文件中的一些变量

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

您可以将它们作为配置对象传递。还可以将路由更改为返回路由的函数,这样它就可以接受参数。

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'
}));

对于数据库连接、模型和其他第三方库,您不需要将它们作为配置对象传递。最好将它们也移动到外部文件中,并在路由的文件中require它们。您需要尽可能多地解耦模块。

请记住,require将加载每个模块一次,其余时间,它只返回对先前加载的模块的引用。查看此问题以了解更多信息。

为了实现更全局的访问,您可以将要共享的变量设置为全局变量。例如

//app.js 
GLOBAL.config = {}

最好为您的应用程序配置使用一个单独的文件。例如

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

并将其作为app.js文件中的全局变量,如下所示

//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');
});