使用mongodb无法通过id获取数据

时间:2015-12-23 14:19:52

标签: node.js mongodb mongoose

我能够使用像db.getCollection('catalog').find({user_id:"56703f1a2fc76861e6a8743e"})这样的终端中的mongo命令来检索我的数据,但是当我尝试使用nodejs时,我得到了null。

我的路线就像这样

var Catalog = require('../models/catalog');

router.get('/', function(req, res) {
  if (!req.user) {
    res.redirect('/login');
  } else{
    Catalog.getAllCatalog('56703f1a2fc76861e6a8743e', function(catalog){
        console.log(catalog) //null
        res.render('catalog/index');
    });
  }
});

我的目录模型

var Catalog = module.exports = mongoose.model('catalog', catalogScheme);
module.exports.getAllCatalog = function(user_id, callback){
    Catalog.find({"user_id":user_id}, callback);
}

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

首先,正如@chridam在他们的回答中已经指出的那样,回调的Node.js约定是它们(至少)有两个参数:第一个保留用于传递错误,第二个用于传递错误,第二个(可能是任何其他)用于传递结果数据。

其次,默认情况下,Mongoose将采用模型名称(在您的情况下为catalog)并将其小写并复数以确定它将使用的MongoDB集合名称。因此,您的模型catalog默认使用名为catalogs的集合。记录此行为here

由于您的数据存储在名为catalog(单数)的集合中,因此您的查询不会产生任何结果。要解决此问题,您需要在架构中指定Mongoose应使用catalog作为集合:

var catalogScheme = mongoose.Schema({
  ...
}, { collection : 'catalog' });

编辑:您还可以完全禁用名称修改,这将使Mongoose使用模型名称作为集合名称:

var mongoose = require('mongoose');
mongoose.set('pluralization', false);

// create your schema/models from here...

答案 1 :(得分:1)

您的回调函数只有一个参数,您需要有两个参数:err对象和result。您可以在else子句中重构您的代码:

Catalog.getAllCatalog('56703f1a2fc76861e6a8743e', function(err, catalog){
    if (err) { /* handle error here */ };
    console.log(catalog);
    res.render('catalog/index');
});