用于API的nodejs + express app的正确模块化结构

时间:2015-02-04 09:51:52

标签: node.js api express routes express-4

我正在尝试使用Express 4为API执行nodejs应用程序。但是当我使应用程序更加模块化时,我的路由不起作用。任何人都可以解释一下我的错误是什么,API的应用结构应该是什么?

我的app.js文件(删除了一些不必要的代码):

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

app.use('/api/v1', v1);
app.use('/api/v2', function(req, res, next) {
    console.log('API Version 2');
    next();
});

app.use('/api', function(req, res, next) {
    console.log('Request of API versions');
    next();
});

我的路线/ v1 / index.js文件:

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

var user = require('./user');
module.exports = router;

我的路线/ v1 / user.js文件:

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

router.route('/')
    .get(function(req, res, next) {
        console.log('USERS GET');
    })
    .post(function(req, res, next) {
        console.log('USERS POST');
    })
    .put(function(req, res, next) {
        console.log('USERS PUT');
    })
    .delete(function(req, res, next) {
        console.log('USERS DELETE');
    });

router.use(function(req, res, next) {
    console.log('USERS last Middleware');
});
module.exports = router;

当我尝试请求此类网址时:http://localhost:3000/api/v1/user

我在仅限控制台的消息中看到:“API版本的请求” - 所以没有在index.js或user.js中触发代码,

但是如果我删除user.js并将请求处理到索引js(来自user.js的router.route('...'),在这种情况下位于index.js) - 所有warks都很好,我看到了消息取决于VERB并且没有“API版本请求”消息。

所以我的问题:为什么会发生?为什么user.js不包括在内并且如果我从index.js连接它不起作用,在这种情况下我将如何制作模块化应用程序?把所有处理放在index.js中 - 不好,因为我需要/ user,/ news,/ comment等处理我想在单独的文件中处理。

2 个答案:

答案 0 :(得分:1)

您的routes / v1 / index.js文件正在导出没有添加路由/中间件的路由器。

在您的routes / v1 / index.js文件中,您可以尝试module.exports = user;

您是否考虑过将routes / v1 / user.js内的路由移至routes / v1 / index.js?

(p.s我很陌生)

答案 1 :(得分:1)

与Matt所说的相似,但并不完全;

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

var user = require('./user');
module.exports = router;

这无所事事,您需要告诉您的路由器使用'用户'文件。

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

router.use('/user', require('./user'));
module.exports = router;