我使用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
答案 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});
});