2016-11-12 54 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你需要的留言,但从来没有使用它,只是出口具有裸路由器没有分配给任何实际的处理程序。