一尘不染

Express:如何将应用程序实例传递到来自其他文件的路由?

node.js

我想将路由分为不同的文件,其中一个文件包含所有路由,另一个文件包含相应的操作。我目前有一个解决方案来实现此目的,但是我需要使应用程序实例成为全局实例,以便能够在操作中对其进行访问。我当前的设置如下所示:

app.js:

var express   = require('express');
var app       = express.createServer();
var routes    = require('./routes');

var controllers = require('./controllers');
routes.setup(app, controllers);

app.listen(3000, function() {
  console.log('Application is listening on port 3000');
});

route.js:

exports.setup = function(app, controllers) {

  app.get('/', controllers.index);
  app.get('/posts', controllers.posts.index);
  app.get('/posts/:post', controllers.posts.show);
  // etc.

};

控制器/index.js:

exports.posts = require('./posts');

exports.index = function(req, res) {
  // code
};

控制器/posts.js:

exports.index = function(req, res) {
  // code
};

exports.show = function(req, res) {
  // code
};

但是,此设置存在一个大问题:我需要传递给操作(controllers /
*。js)的数据库和应用程序实例。我能想到的唯一选择是将两个变量都设置为全局变量,这并不是真正的解决方案。我希望将路线与操作分开,因为我有很多路线,并且希望将它们放在中央位置。

将变量传递到动作但将动作与路线分开的最佳方法是什么?


阅读 287

收藏
2020-07-07

共1个答案

一尘不染

使用req.appreq.app.get('somekey')

通过调用创建的应用程序变量在express()请求和响应对象上设置。

参见:https
:
//github.com/visionmedia/express/blob/76147c78a15904d4e4e469095a29d1bec9775ab6/lib/express.js#L34-L35

2020-07-07