【问题标题】:Module Routes Not Working In Expess模块路由在 Express 中不起作用
【发布时间】:2016-06-23 19:16:05
【问题描述】:

我最初在一个 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);

新的 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;
}

settings-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;
}

【问题讨论】:

    标签: javascript node.js express routing


    【解决方案1】:

    我会更改您设置路由器中间件的方式,使其工作方式略有不同。无需传递 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 个文件。这将是一个更好的做法。

    【讨论】:

    • 嘿伙计!非常感谢您的详细解释!这真的很有帮助。我改变了一些东西并摆脱了我的 index.js 文件。我在网上看到一些文章说最好将所有这些都保存在一个文件中。我确实遇到了 router.use() 方法的问题。除非我将 express 参数传递给函数,否则我无法让我的 proutes 工作。如果你有时间,请查看我的更新。
    【解决方案2】:

    我在您的代码 sn-ps 中没有看到您将路由器挂载到应用程序的任何地方。

    例如:

    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) { ... });
    

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 2017-07-01
      • 2018-06-07
      • 2014-05-16
      • 2013-11-20
      • 1970-01-01
      • 2017-10-02
      • 2019-07-19
      相关资源
      最近更新 更多