模块路由在Expess中不起作用

时间:2016-06-23 19:16:05

标签: javascript node.js express routing

我最初在一个api.js中编写了我的路线,但我认为有一种更好的方法并绕过互联网查看人们如何实现内容。我按照了几个教程,提出了以下布局,其中server.js是我的启动:

-app
--models
--routes
---index.js
---settings.js
---sources.js
server.js

我将我的路线分解为设置和来源,在index.js中调用它们并在server.js中要求它们。我希望一切都能正常工作,但是当我测试路线时,没有任何东西可以解析/ settings或/ sources。我不知道我错过了什么,但我一直在讨论这个问题,我认为这可能是一些愚蠢的事情,我没有得到。我不知道这个过程的哪个部分我错了,我一直在看它太久了!任何帮助表示赞赏,谢谢!

server.js

var routes = require('./app/routes')(app, express)
app.listen(config.port);
console.log('Magic happens on port ' + config.port + '!');

index.js

module.exports = function(app, express){
    require('./settings')(app, express);
    require('./sources')(app, express);
}

settings.js(sources.js非常相似,所以为了简洁,我将其留下)

var bodyParser = require('body-parser');
var Settings = require('../models/settings');

module.exports = function (app, express) {
    var router = express.Router();

    //route for settings
    router.route('/settings')
        .get(function (req, res) {
            //check to see if any records exists
            ...
        })
        .put(function (req, res) {
           ...
        });

    return router
}

更新 我删除了我的index.js文件,并将app.use语句放入server.js文件中。但是,如果不通过明确的论证,我无法让它工作。我尝试按照settings-2.js的回答中的建议,但没有骰子。

我做了什么: server.js

//routes!
app.use('/', require('./app/routes/settings')(express));
app.use('/', require('./app/routes/sources')(express));
app.use('/settings2', require('./app/routes/settings-2'));

//start it up
app.listen(config.port);

new settings.js

module.exports = function (express) {
    var apiRouter = express.Router();

    //route for settings
    apiRouter.route('/settings')
        .get(function (req, res) {
           ...
        .put(function (req, res) {
            ...
        });

    return apiRouter;
}

设置 - 2.js 这不适用于localhost:8080 / settings2。没有错误,但请求只是在Postman中超时。

var Settings = require('../models/settings');
module.exports = function () {
    var apiRouter = require('express').Router();

    //route for settings
    apiRouter.route('/')
        .get(function (req, res) {
            //check to see if any records exists
           ...
        })
        .put(function (req, res) {
            ...
        });

    return apiRouter;
}

2 个答案:

答案 0 :(得分:2)

我会改变你设置路由器中间件的工作方式略有不同。您可以在路由器中包含express,而不是绕过express模块。此外,没有理由传递app因为你甚至没有使用它并且它违反直觉,因为它打破了你试图通过使用路由器中间件建立的关注点的分离。

我想说看看如何构建Express应用程序的最佳方法是查看express-generator构建应用程序的方式。

server.js

var express = require('express');
var bodyParser = require('body-parser');
var routes = require('./routes/index');

var app = express();
var port = process.env.PORT || 3000;

app.use(bodyParser.json());
app.use('/', routes);

app.listen(port);

index.js

var router = require('express').Router();
var settings = require('./settings');
var sources = require('./sources');

module.exports = function() {
    router.use('/settings', settings);
    router.use('/sources', sources);

    return router;
}

settings.js

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

module.exports = function() {

    router.route('/')
        .get(function(req, res) {
            // do GET /settings route work
        })
        .put(function(req, res) {
            // do PUT /settings route work
        })

    return router;
}

sources.js

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

module.exports = function() {

    router.route('/')
        .get(function(req, res) {
            // do GET /sources route work
        })
        .put(function(req, res) {
            // do PUT /sources route work
        })

    return router;
}

同样在上面的代码中,可能最好摆脱index.js代码并将两个/settings/sources中间件语句迁移到server.js并减少代码由1个文件。这将是一种更好的做法。

答案 1 :(得分:0)

我没有在您的代码段中看到您将路由器安装到应用程序的任何位置。

例如:

index.js

module.exports = function(app, express){
    app.use('/', require('./settings')(app, express));
    app.use('/', require('./sources')(app, express));
}

我经常看到一个看起来更像这样的布局:

app
|-- server.js
`-- routes
    |-- settings.js
    `-- sources.js

server.js

var express = require('express');
var app = express();
app.use('/settings', require('./routes/settings'));
app.use('/sources', require('./routes/sources'));
app.listen(port)

settings.js

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

router.get('/', function(req, res, next) { ... });
router.put('/', function(req, res, next) { ... });