Express.js路由模块无法正常工作

时间:2016-07-20 16:35:21

标签: node.js express routing routes

我使用Express.js在导出的路线上遇到了一些奇怪的行为。我的HTML路由工作正常,但我的api路由(api路由在一个单独的文件中)返回“不能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

4 个答案:

答案 0 :(得分:1)

我看到两个问题。

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

// 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', ...);

答案 1 :(得分:0)

在server.js中只尝试这两行

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

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

答案 2 :(得分:0)

在您的server.js文件中,您不需要// html和// api路由下的app.use。您可以删除它们,然后只需添加

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

遵循相同的风格

答案 3 :(得分:0)

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