NodeJS Express 通过一个路由文件引用多个路由文件

6

我正在学习NodeJS。我有一个NodeJS API项目。我想在路由中使用版本,因此我创建了以下文件夹结构。

application/    
    --app.js
    --routes/
    ----V1/
    ------routes.js
    ------users.js

这是我的app.js文件:

 var v1 = require('./routes/v1/route');

 app.use('/api/v1', v1.router);

这是route.js文件:

var express = require('express');
var router = express.Router();
router.get('/',function(req,res){    
    res.send("Welcome to Node JS V1");
});

var courses = require('./users').router;
-- How to include usres route here

module.exports.router = router;

users.js 文件:

var express = require('express');
var router = express.Router();
router.get('/',function(req,res){    
    res.send("Get all users.");
});


module.exports.router = router;

现在我该如何从route.js文件中调用用户。
2个回答

13

我会和@Shaharyar有所不同

routes.js

var express = require('express');
var router = express.Router();

router.get('/', function(req, res) {
  res.send('Welcome to Node JS V1');
});

router.use('/users', require('./users').router);

module.exports.router = router;

用户.js

var express = require('express');
var router = express.Router();

router.get('/',function(req, res){    
  res.send('Get all users.');
});

router.post('/', function(req, res) {
  // Create user
  res.send('Some response.');
});

module.exports.router = router;
为了简化,我会在module.exports上省略.router并执行。
router.use('/users', require('./users'));

同样的方法也适用于route.js文件,在你的server.js或其他位置中:

router.use('/api/v1', require('./routes'));
router.use('/api/v2', require('./routes2'));

就是我想要的方式。谢谢 :)。 - Sid
1
你的方法看起来非常干净,但是你不觉得你正在创建太多的 express 实例吗?为什么不使用一个实例就可以完成呢? - Shaharyar
@Shaharyar 模块在 node 中被缓存。express 模块公开了 createApplication 工厂 (var app = express()) 和其他一些东西,包括 Router 构造函数。 - Jordonias
我知道模块是被缓存的。但是实例不是,如果我没记错的话,它会创建一个新的实例 var router = express.Router()。我指的就是这个。 - Shaharyar

8
你应该创建一个 express 实例并将其传递到所有模块中。 route.js 文件
//initialize
var express = require('express');
var router = express.Router();

router.get('/', function(req, res){    
    res.send("Welcome to Node JS V1");
});

//modules
require('./users')(router);
require('./sessions')(router);  //added for explaination
require('./comments')(router);  //added for explaination

//export
module.exports.router = router;

模块文件 (任何模块如用户、评论等)

//initialize
module.exports = function (router) {
    router.get('/users', users);
}

//APIs
function users(req, res) {    
    res.send("Get all users.");
}

这显示了一个错误,即在模块文件(users.js)中的router.get中无法读取未定义的属性“get”。 - Sid
现在试试,我已经从内部引用了 router - Shaharyar
当您加载大量软件包(如mongodb、cron jobs、mandrill emails等)时,这看起来怎么样?您是否将12个变量传递给所有子模块?有没有更好的方法来设置这些全局变量,以便可以在任何地方自动引用它们,而无需编写所有这些粘合代码? - Cory Schulz
@CorySchulz 不需要将所有的包从主文件注入到子模块中。你只需要在需要它们的模块内引用这些包即可。你可以提出一个单独的问题,解释你的情况,我会给你解答。 - Shaharyar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接