微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – Express:如何将app-instance从不同的文件传递到路由?

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

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

routes.js:

exports.setup = function(app,controllers) {

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

};

controllers / index.js:

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

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

controllers / posts.js:

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

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

然而,这个设置有一个大问题:我有一个数据库一个应用程序实例,我需要传递到actions(controllers / *。js)。我唯一可以想到的选择是,使两个变量全局,这不是一个真正的解决方案。我想从行动中分离路线,因为我有很多路线,并希望他们在一个中心的地方。

将变量传递给操作但将操作与路由分开的最好方法是什么?

解决方法

Node.js支持循环依赖。使用循环依赖而不是require(‘./ routes’)(app)清理大量代码,并使每个模块在其加载文件上的依赖性较小:

app.js

var app = module.exports = express(); //Now app.js can be required to bring app into any file

//some app/middleware setup,etc,including 
app.use(app.router);

require('./routes'); //module.exports must be defined before this line

routes / index.js

var app = require('../app');

app.get('/',function(req,res,next) {
  res.render('index');
});

//require in some other route files...each of which requires app independently
require('./user');
require('./blog');

—– 04/2014更新—–
Express 4.0通过添加express.router()方法来修复用于定义路由的用例。
文档 – http://expressjs.com/4x/api.html#router

从他们的新发电机的例子:
写路线:https://github.com/expressjs/generator/blob/master/templates/js/routes/index.js
将其添加/命名空间到应用程序:
https://github.com/expressjs/generator/blob/master/templates/js/app.js#L24

仍然有用于从其他资源访问应用程序的用例,因此循环依赖项仍然是一个有效的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐