【问题标题】:Express.js route modules not workingExpress.js 路由模块不起作用
【发布时间】:2016-11-23 23:24:42
【问题描述】:

我使用 Express.js 导出的路由出现了一些奇怪的行为。我的 HTML 路由工作正常,但我的 api 路由(api 路由在单独的文件中)返回“Cannot GET /api”。但是,如果我将我的 api 路由移动到与我的 html 路由相同的文件中,那么 api 路由会突然起作用。我查看了 Stack 上的其他示例,但没有一个是导出到服务器文件的路由。我想让 HTML 和 API 路由都在单独的文件中工作。代码如下:

文件结构:

    ├── app
│   ├── data
│   │   └── dogs.js
│   ├── public
│   │   ├── add.html
│   │   ├── css
│   │   │   └── main.css
│   │   ├── home.html
│   │   ├── javascript
│   │   │   └── app.js
│   │   └── survey.html
│   └── routing
│       ├── api-routes.js
│       └── html-routes.js
└── server.js

Server.js 文件

// Dependencies
// =============================================================
var express = require('express');
var bodyParser = require('body-parser');
var path = require('path');
var PORT = 8080;
var app = express();


app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.text());
app.use(bodyParser.json({type:'application/vnd.api+json'}));


//html routes
app.use('/', require('./app/routing/html-routes'));
app.use('/add', require('./app/routing/html-routes'));
app.use('/survey', require('./app/routing/html-routes'));

//api routes
app.use('/api/:dogs?', require('./app/routing/api-routes'));


// Starts the server to begin listening
// =============================================================
app.listen(PORT, function(){
    console.log('App listening on PORT ' + PORT);
})

html-routes.js

var express = require('express');
var app = express();
var router = express.Router();
var path = require('path');
var dogs = require('../data/dogs');

router.get('/', function(req, res){
    res.sendFile(path.join(__dirname, '../public/home.html'));
})

router.get('/survey', function(req, res){
    res.sendFile(path.join(__dirname, '../public/survey.html'));
})

router.get('/add', function(req, res){
    res.sendFile(path.join(__dirname, '../public/add.html'));
})

module.exports = router

api-routes.js

var express = require('express');
var app = express();
var apiRouter = express.Router();
var path = require('path');
var dogs = require('../data/dogs');

apiRouter.get('/api/:dogs?', function(req, res){

// refactor this
    var chosen = req.params.dogs;

    if(chosen){
        console.log(chosen);

        for (var i=0; i < dogs.length; i++){

            if (chosen == dogs[i].id){
                res.json(dogs[i]);
                return;
            }
        }

        res.json(false);
    }

    else{
        res.json(dogs);
    }
})

module.exports = apiRouter

html-routes.js 文件中带有 api 路由的 html 路由。这有效,无需更改 server.js 文件中的任何内容。

    var express = require('express');
    var app = express();
    var router = express.Router();
    var path = require('path');
    var dogs = require('../data/dogs');



    router.get('/', function(req, res){
        res.sendFile(path.join(__dirname, '../public/home.html'));
    })

    router.get('/survey', function(req, res){
        res.sendFile(path.join(__dirname, '../public/survey.html'));
    })

    router.get('/add', function(req, res){
        res.sendFile(path.join(__dirname, '../public/add.html'));
    })

    // api routes


    router.get('/api/:dogs?', function(req, res){
    // refactor this
        var chosen = req.params.dogs;

        if(chosen){
            console.log(chosen);

            for (var i=0; i < dogs.length; i++){

                if (chosen == dogs[i].id){
                    res.json(dogs[i]);
                    return;
                }
            }

            res.json(false);
        }

        else{
            res.json(dogs);
        }
    })

    router.post('/api/newdog', function(req, res){

            var newDog = req.body;

            console.log(newDog);

            dogs.push(newDog);

            res.json(newDog);

})


module.exports = router

【问题讨论】:

    标签: node.js express routing routes


    【解决方案1】:

    在您的 server.js 文件中,您不需要 //html 和 //api 路由下的 app.uses。你可以删除那些然后放

    require("./app/routing/api-routes")(app);
    require("./app/routing/html-routes")(app);
    

    现在在你的 html-routes 文件中你不需要使用你的router var = express.Router()。您需要做的就是创建一个函数

    module.exports = function(app) {
      app.get("/survey", function(req,res) {
        res.sendFile(path.join(__dirname, "../public/survey.html"));
      })
    
      app.use(function (req, res){
        res.sendFile(path.join(__dirname, "../public/home.html"));
      })
    }
    

    使用您的 api-routes 遵循相同的风格

    【讨论】:

    • 您的解决方案有效@wkerman。谢谢!重构后的 api 路由看起来像这样module.exports = function(app) { app.get("/api/:dog?", function(req,res) { console.log('end point reached') // refactor this var chosen = req.params.dogs; if(chosen){ console.log(chosen); for (var i=0; i &lt; dogs.length; i++){ if (chosen == dogs[i].id){ res.json(dogs[i]); return; } } res.json(false); } else{ res.json(dogs); } }) }
    【解决方案2】:

    我看到了两个问题。

    首先是您安装路由器的顺序。您应该先安装更具体的路由器:

    // more specific
    app.use('/api/:dogs?', require('./app/routing/api-routes'));
    // less specific
    app.use('/', require('./app/routing/html-routes'));
    

    (您对/add/survey 的声明是多余的,因为它们将由后者处理)

    其次,路由器的工作与其挂载路径有关。换句话说,如果你想让路由器处理所有以/api 开头的路由,你可以这样:

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

    如果您希望同一路由器处理 /api/foo,那么您应该让它处理 relative/api 前缀的路由,如下所示:

    router.get('/foo', ...);
    

    【讨论】:

      【解决方案3】:

      在 server.js 中只尝试这两行

      //html routes
      app.use('/', require('./app/routing/html-routes'));
      
      //api routes
      app.use('/api', require('./app/routing/api-routes'));
      

      【讨论】:

      • 我知道我现在只需要两条路由路径,但它似乎对我的路由没有任何影响,我仍然收到 Cannot GET /api/
      【解决方案4】:

      app.js/server.js 文件下,确保您在顶部需要新的路由文件。然后在app.use 上执行以下操作:

      app.use('/', your_new_route);
      

      从那里您将能够调用新路由中定义的任何端点,例如

      router.get('/filesize', function(req, res) {
          console.log('File Uplaod');
          res.json({error_code:0,err_desc:null});
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        • 2019-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多