Mongoose findById Route Issue

时间:2014-09-26 00:26:31

标签: node.js mongodb mongoose

我正在编写一个主要用作购物车的网络应用程序。该应用程序的登陆/主页反映了当前可供销售的产品。我想做的是使用产品ID路由到每个产品。我已经定义了一个产品模型(adminProductModel),如下所示:

'use strict';
var mongoose = require('mongoose');

var productModel = function () {

//Define a super simple schema for our products.
var productSchema = mongoose.Schema({
    name: String,
    price: Number,
    productImg: String,
    description: String
});

return mongoose.model('Product', productSchema);

};

module.exports = new productModel();

我可以通过管理员控制器使用上述模型发布,获取和删除产品。效果很好!然后我继续创建了一个项目控制器,模型和模板,定义如下,打算使用项目/产品&从主页(index.dust)路由到项目页面#39; s id。

项目控制器:

'use strict';

 var ItemModel = require('../../models/adminProductModel');
 var db = require ('../../lib/database');

 module.exports = function (router) {

 router.get('/index/:id', function (req, res) {
   db.ItemModel.findById({_id: req.params._id}, function (err, prod){
       if(err){
           console.log('FindById filter error:', err)
       }

       var model = {product: prod}

       res.render('item/index', model);
      });   
    });
  };

项目模型:

'use strict';

 module.exports = function ItemModel() {

 return {
    name: 'item'
   };
 };

主页(索引)上的相关代码是: 模板(使用灰尘作为渲染引擎):

{>"layouts/master" /}
{<title}
    Greatness!
{/title}
{<body}
{?products}
        {#products}
        <div class="col-sm-6 col-md-3">
            <div class="thumbnail">  
                <a href = "/index/{.id}" class = "thumbnail"><img src="img/photo.png" alt="photo" width ="260" height = "180"/></a>
                <center>
                    <h5>{.name}</h5>
                    <p>${.price}</p>
                    <a href="/index/{.id}" class="btn btn-success">Buy</a>
                </center>
            </div>
        </div>
        {/products}
    {/products}
 {/body}

单击锚标记时,它会从索引页面路由到正确的ID,但会抛出以下文件未找到错误&#34; URL / index / 542237117b5f3e72136d70c5未解析为路由&#34;。

我在这里做错了什么?我知道我必须通过其唯一的objectId查询数据库中的产品。我是否实施了这个错误?如果是这样,为什么它解决了文件未找到错误或至少呈现正确的标记?

提前感谢。我花了几天时间思考这个问题,而且我已经用尽了所有解决这个问题的方法。我已将数据库包括在内以便完整:

use strict';
var mongoose = require('mongoose');

var db = function () {
return {
    config: function (conf) {
        mongoose.connect('mongodb://' + conf.host + '/' + conf.database);
        var db = mongoose.connection;
        db.on('error', console.error.bind(console, 'connection error:'));
        db.once('open', function callback() {
            console.log('db connection open');
        });
     }
   };
 };

 module.exports = db();

使用单独的架构定义我的itemModel可能是明智的吗?这似乎是多余的,更容易出错。我将进一步阅读此内容并回到主页,获取此处的反馈意见。再次感谢。

1 个答案:

答案 0 :(得分:1)

嗨,你从params获得id值,但它是:id not:_id

你这样做

 console.log("id value : "+req.params._id)
db.ItemModel.findById({_id: req.params._id}, function (err, prod){

应该是这样的

 console.log("id value : "+req.params.id)
db.ItemModel.findById({_id: req.params.id}, function (err, prod){