2016-07-20 10 views
2

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 

Antwort

0

In Ihrem server.js Sie brauchen nicht die app.use s Datei, die Sie unter // html und // api Routen haben. Sie können diese löschen und setzen Sie dann nur

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

Jetzt in Ihrem HTML-Routen-Datei drehen Sie nicht Ihre router var = express.Router() verwenden müssen.

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

Folgen Sie den gleichen Stil mit Ihren api-Routen

+0

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

0

Versuch mit nur diesen zwei Linien in server.js

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

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

ich, dass ich die beiden Streckenwege müssen nur jetzt bekommen definiert nennen, aber es schien keinen Effekt auf mein Routing zu haben und ich bekomme immer noch keine GET/api/ –

0

Ich sehe zwei Probleme.

Zuerst ist die Reihenfolge, in der Sie die Router montieren. Sie sollten mehr spezifische Router montieren zuerst:

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

(Ihre Erklärungen für /add und /survey überflüssig sind, da sie von diesem behandelt werden wird)

Zweitens Router zu ihren Mount-Pfad relativ zu arbeiten. Mit anderen Worten, wenn Sie einen Router wollen alle Routen zu behandeln, die mit /api starten, können Sie diese verwenden:

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

Wenn Sie möchten, dass gleiche Router /api/foo zu handhaben, dann sollten Sie haben es die Route relativ Griff zum /api Präfix, etwa so:

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

Unter app.js/server.js Datei sicherstellen, dass Sie benötigen, um Ihre neue Route Datei oben Alles, was Sie tun müssen, ist eine Funktion erstellen.Dann auf app.use wie folgt vor:

app.use('/', your_new_route); 

Von dort können Sie alle Endpunkte in der neuen Route zB

router.get('/filesize', function(req, res) { 
    console.log('File Uplaod'); 
    res.json({error_code:0,err_desc:null}); 
}); 
Verwandte Themen