2016-11-12 4 views
0

Ich bin ziemlich neu beim Erstellen von APIs mit Node, Express und Mongo.Route in Express nicht gefunden

Ich versuche meine Express Mongoose API zu modularisieren, aber aus irgendeinem Grund sieht mein Code die exportierte Route nicht.

Wenn ich PostMan zum Testen verwende, bekomme ich einen 404 Fehler.

Alle meine Dateien im selben Ordner

Ich habe meine Haupt app.js Datei befinden:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var mongoose = require('mongoose'); 
var cors = require('cors'); 

mongoose.connect('mongodb://localhost/guestbook'); 

var app = express(); 

// uncomment after placing your favicon in /public 
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cookieParser()); 
app.use(cors());  

app.use('/api', require('./routes/api')); 


    // changes it to use the optimized version for production 
    app.use(express.static(path.join(__dirname, '/dist'))); 

    // production error handler 
    // no stacktraces leaked to user 
    app.use(function(err, req, res, next) { 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: {} 
     }); 
    }); 


module.exports = app; 

ich meine api.js Datei, die ich in meinem app.js Referenz:

//DEPENDENCIES 
var express = require('express'); 
var router = express.Router(); 


//include the routes file 
var guestbook = require('./guestbook'); 

router.route('/guestbook'); 



//RETURN ROUTER AS MODULE 
module.exports = router; 

Und schließlich meine Route, die meine guestbook.js Datei ist:

//DEPENDENCIES 
var express = require('express'); 
var router = express.Router(); 


//GUESTBOOK END POINTS 
var Guestbook = require('../models/guestbook') 

router.route('/guestbook') 

.post(function(req, res) { 

    var guestbook = new Guestbook(); 

    guestbook.firstname = req.body.firstname; 
    guestbook.lastname = req.body.lastname; 
    guestbook.email = req.body.email; 
    guestbook.postedon = req.body.postedon; 
    guestbook.comment = req.body.comment; 
    guestbook.rate = req.body.rate; 

    guestbook.save(function(err) { 
     if (err) 
      res.send(err); 

     res.json({ message: 'Post created!' }) 

    }); 

}) 

.get(function(req, res) { 
    Guestbook.find(function(err, guestbook) { 
     if (err) 
      res.send(err); 

     res.json(guestbook); 
    }); 

}); 


router.route('/guestbook/:id') 

.get(function(req, res) { 

    Guestbook.findById(req.params.id, function(err, guestbook) { 
     if (err) 
      res.send(err); 

     res.json(guestbook); 

    }); 

}) 

.put(function(req, res) { 

    Guestbook.findById(req.params.id, function(err, guestbook) { 

     if (err) 
      res.send(err); 

     //USING OBJECT.KEYS TO UPDATE ONLY PARAMS PASSED 
     Object.keys(req.body).forEach(function(prop) { 
      if (typeof req.body[prop] !== 'undefined') { 
       guestbook[prop] = req.body[prop]; 
      } 
     }); 

     guestbook.save(function(err) { 

      if (err) 
       res.send(err); 

      res.json(guestbook); 

     }); 

    }); 

}) 

.delete(function(req, res) { 

    Guestbook.remove({ _id: req.params.id }, function(err, guestbook) { 
     if (err) 
      res.send(err); 
     res.json({ message: 'Successfully deleted!' }); 
    }); 

}); 


//RETURN ROUTER AS MODULE 
module.exports = router; 

Wenn ich meine guestbook.js-Datei in api.js umbenennen und direkt von meiner app.js verweisen würde, funktioniert alles gut, aber ich versuche, eine api.js-Datei in der Mitte zu verwenden, also kann ich besser meinen Code organisieren.

Irgendwelche weisen Ratschläge, wie das zu beheben wäre toll !! Nicht sicher, was ich vermisse, das gibt mir den 404 Fehler.

Antwort

2

Sie haben ein paar Probleme:

  1. Sie verwenden /guestbook zu oft in der Routendefinition.
  2. Sie haben die guestbook.js nicht wirklich in Ihre Routen eingebunden.

Also, es scheint, dass Sie Routen für erstellt haben:

/api/guestbook/guestbook/ 
/api/guestbook/guestbook/:id 

Sie benötigen eine der dazwischen liegenden .route('/guestbook') Sie haben zu entfernen.

Deshalb, wenn Sie den Code in api.js entfernen, die das Extra .route('/guestbook') tut, dann beginnen die Dinge zu arbeiten.


Sie müssen entscheiden, wo Sie den /guestbook Teil des Pfades definieren möchten. Wenn Sie es in api.js definiert wollen, dann können Sie nur, dass lassen wie es ist und in guestbook.js, ändern Sie diese:

router.route('/guestbook') 

dazu:

router.route('/') 

Und, ändern Sie diese:

router.route('/guestbook/:id') 

zu diesem:

router.route('/:id') 

Und dann Gästebuch zu haken.js in die Routing-Kette, können Sie dies ändern:

router.route('/guestbook'); 

dazu:

// hook up guestbook router 
router.use('/guestbook', guestbook); 
+0

Das stimmt auch, aber er benutzt auch nicht die Datei guestbook.js. – Paul

+0

Ich bin mir nicht sicher, dass das Problem ist, wie ich versucht habe (nach Localhosl: 3000) in Postman und ich immer noch die 404. Sagt, dass Sie vorschlagen, dass ich eine einzelne Route "/ api/Gästebuch/Gästebuch /: id "und das sollte für alle Verben gut sein? – cnak2

+0

@Paul - Ja, Sie haben Recht. Ich habe den Code zu meiner Antwort hinzugefügt. – jfriend00

0

In api.js das Gästebuch sind erforderlich, aber nie verwenden und nur die nackten Router exportieren, hat nichts zugewiesenen tatsächlichen Handlern.

Verwandte Themen