Ich habe ein seltsames Verhalten mit meinen exportierten Routen mit Express.js. Meine HTML-Routen funktionieren gut, aber meine API-Routen (API-Routen sind in einer separaten Datei) gibt "Can not GET/api" zurück. Wenn ich jedoch meine API-Routen in dieselbe Datei wie meine HTML-Routen verschiebe, funktionieren die API-Routen plötzlich. Ich habe mir andere Beispiele in Stack angesehen, aber keine Routen wurden in die Serverdatei exportiert. Ich möchte sowohl HTML als auch API-Routen in separaten Dateien arbeiten lassen. Hier ist der Code:Express.js Route Module funktioniert nicht
Dateistruktur:
├── 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 Datei
// 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-Routen mit API-Routen in der Datei html-routes.js. Dies funktioniert und Sie müssen nichts in der Datei server.js ändern.
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
Ihre Lösung funktioniert @wkerman. Vielen Dank! Die API-Routen refaktoriert sieht wie folgt aus: 'module.exports = function (app) { app.get ("/ api /: Hund?", Funktion (req, res)) { console.log (' Endpunkt erreicht ') // Umgestalten Diese \t var gewählt = req.params.dogs; \t if (gewählt) { \t \t console.log (gewählt); \t \t für (var i = 0; i