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