【发布时间】: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