2016-11-12 3 views
0

Я довольно новичок в создании API-интерфейсов с узлом, Express и Mongo.Маршрут в экспресс не найден

Я пытаюсь модулизовать свой API Express Mongoose, но по какой-то причине мой код не видит экспортированный маршрут.

Когда я использую PostMan для тестирования, я получаю ошибку 404.

Все мои файлы находятся в той же папке

У меня есть главный app.js файл:

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; 

У меня есть api.js файл, который я ссылку в моих app.js:

//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; 

И, наконец, мой маршрут, который мой guestbook.js файл:

//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; 

Если бы я переименовал свой файл guestbook.js в api.js и ссылался на него непосредственно из моего app.js, все работает нормально, но я пытаюсь использовать файл api.js посередине, поэтому могу лучше организовать мой код.

Любой совет мудреца о том, как исправить это было бы здорово !! Не уверен, что мне не хватает, что дает мне ошибку 404.

ответ

2

У вас есть несколько вопросов:

  1. Вы с помощью /guestbook слишком много раз в своем определении маршрута.
  2. На самом деле вы не подключили guestbook.js к своим маршрутам.

Таким образом, оказывается, вы создали маршруты для:

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

Вам нужно удалить один из промежуточной .route('/guestbook') у вас есть.

Именно поэтому, когда вы удаляете код в api.js, который делает дополнительные .route('/guestbook'), тогда все начинает работать.


Вы должны решить, где вы хотите, чтобы определить /guestbook часть пути. Если вы хотите определить в api.js, то вы можете просто оставить это как есть и в guestbook.js, изменить:

router.route('/guestbook') 

к этому:

router.route('/') 

И изменить это:

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

к настоящему времени:

router.route('/:id') 

И затем, чтобы забрать гостевую книгу.JS в цепочку маршрутизации, вы можете изменить это:

router.route('/guestbook'); 

к этому:

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

Это также верно, но он также не работает с файлом guestbook.js. – Paul

+0

Я не уверен, что это проблема, поскольку я пытался использовать это (после localhosl: 3000) в Postman, и я до сих пор получаю 404. Как говорится, вы предлагаете использовать один маршрут «/ api/guestbook/guestbook /: id ", и это должно быть хорошо для всех глаголов? – cnak2

+0

@Paul - Да, вы правы. Я добавил код для этого ответа. – jfriend00

0

В API.js вы не требуете гостевого, но никогда не использовать его и просто экспортировать голый маршрутизатор, который имеет ничто не привязано к каким-либо фактическим обработчикам.

Смежные вопросы