2016-11-12 57 views
0

我對使用Node,Express和Mongo構建API相當陌生。未找到Express中的路由

我試圖模塊化我的Express Mongoose API,但出於某種原因,我的代碼沒有看到導出的路由。

當我使用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

我不確定這是什麼問題,因爲我在Postman中使用過這個(在localhosl:3000之後),我仍然得到了404。這就是說,你是在暗示我使用單一路由「/ api/guestbook/guestbook /:id「,這對所有動詞都有好處? – cnak2

+0

@保羅 - 是的,你是對的。我已經將代碼添加到我的答案中了。 – jfriend00

0

在API.js你需要的留言,但從來沒有使用它,只是出口具有裸路由器沒有分配給任何實際的處理程序。