Express.js路由模块不工作

我得到一些奇怪的行为与我使用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 

在你的server.js文件中,你不需要app.use你在// html和// apipath下。 你可以删除这些,然后放

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

现在在你的html路由文件里面,你不需要使用你的router var = express.Router() 。 所有你需要做的就是创build一个函数

 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路线

我看到两个问题。

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

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

(你的/add/survey申报是多余的,因为他们将由后者处理)

其次,路由器相对于其安装path工作。 换句话说,如果你想要一个路由器来处理所有以/api开始的路由,你可以使用这个:

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

如果你想让相同的路由器处理/api/foo ,那么你应该让它处理对于/api前缀的路由,如下所示:

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

尝试在server.js中只有这两行

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

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