Не удается найти по _id в mongodb с помощью драйвера nodejs 1.4

У меня есть очень простое приложение, которое создает отчеты. У меня есть часть, которая должна запрашивать и извлекать _id из базы данных mongo. Как бы то ни было, я не могу заставить работать поиск по _id. Имейте в виду, просто find() работает, когда мне нужно показать все отчеты. Я искал Overflow и пробовал кучу разных решений, которые я видел, но ни одно из них не работает...:

ObjectID(req.params.string)
new ObjectID(req.params.string)
BSON.ObjectID(req.params.id)
db.collection.serializer.ObjectID....etc

Вот текущий код для этой части, и я использую новейшие версии mongoDB и драйвера (2.6 и 1.4), спасибо за любую помощь, ребята!: фрагмент из reportRoutes.js var mongo = require('mongodb');

var Server = mongo.Server,
    Db = mongo.Db,
    BSON = mongo.BSONPure;
    ObjectID = mongo.ObjectID;

  exports.findById = function(req, res) {
  var id = new ObjectID.createFromHexString(req.params.id);
  console.log('Retrieving report: ' + id);
  db.collection('reports', function(err, collection) {
  db.collection.findOne({ '_id': (id)}, function(err, item) {
      res.send(item);
      });
  });
};

Фрагмент из Server.js

    app.get('reports/:id', reportRoutes.findById);

Вот вывод консоли, когда я иду

http://localhost:3000/reports/53d2c100132358560c000001:

Uncaught TypeError: Невозможно прочитать свойство getCurrent неопределенного popup.js: 17

вот документ монго, когда я пойду

http://localhost:3000/reports/ <-just does a collection.find()

{
"_id": "53d2c100132358560c000001",
"name": "Whatheheck",
"author": "cornhole",
"date": "07232014",
"costs": "200",
"cash": "2070",
"avoidances": "9000",
"reuse": "3000",
"recycle": "20000",
"time": "",
"description": "",
"picture": null
}

Вот документ, извлеченный из mongoshell с помощью db.reports.find().pretty()

{
    "_id" : ObjectId("53d2c100132358560c000001"),
    "name" : "Whatheheck",
    "author" : "cornhole",
    "date" : "07232014",
    "costs" : "200",
    "cash" : "2070",
    "avoidances" : "9000",
    "reuse" : "3000",
    "recycle" : "20000",
    "time" : "",
    "description" : "",
    "picture" : null
}

person Steve Liu    schedule 26.07.2014    source источник
comment
Любой из первых двух определенно будет работать. Можете ли вы дополнить свой вопрос выводом console.log и дампом документа, который вы пытаетесь найти, который показывает его _id?   -  person JohnnyHK    schedule 26.07.2014
comment
Привет, Джонни, тебе нужна эта новая информация? Спасибо!   -  person Steve Liu    schedule 28.07.2014
comment
Нет, как выглядит документ, когда вы запрашиваете его в оболочке?   -  person JohnnyHK    schedule 28.07.2014
comment
Отлично, спасибо. Я хотел убедиться, что _id в документе на самом деле был ObjectID, а не строкой.   -  person JohnnyHK    schedule 29.07.2014


Ответы (2)


В обратном вызове db.collection вы вызываете db.collection.findOne вместо того, чтобы вызывать collection.findOne. Что-то вроде этого:

exports.findById = function(req, res) {
    var id = ObjectID(req.params.id);
    db.collection('reports', function(err, collection) {
        collection.findOne({ '_id': id }, function(err, item) {
            res.send(item);
        });
    });
};
person JohnnyHK    schedule 29.07.2014
comment
Спасибо, Джонни, я пробовал, но все равно не работает. такая же ошибка в журнале консоли в chrome и ошибка 404 в консоли nodejs. Любые другие идеи о том, почему это не работает? - person Steve Liu; 29.07.2014
comment
@SteveLiu Если вы получаете ошибку 404, это означает, что ваш обработчик маршрута даже не вызывается, и это не имеет ничего общего с MongoDB. Честно говоря, вы должны действительно отлаживать это, а не просить других сделать это за вас, выискивая проблемы и догадываясь. - person JohnnyHK; 29.07.2014
comment
Я дважды проверю routeHandler, но POST работает для добавления отчета и GET для работы всех отчетов. Я просто не могу обойтись одним отчетом... - person Steve Liu; 29.07.2014
comment
@JohhnyHK Я дважды все проверил и понял, что вместо app.get('reports/:id', reportRoutes.findById); это должно было быть pp.get('/reports/:id', reportRoutes.findById); Спасибо за указатель! - person Steve Liu; 30.07.2014

@JohhnyHK Я все перепроверил и понял, что вместо

app.get('reports/:id', reportRoutes.findById); 

это должно было быть

app.get('/reports/:id', reportRoutes.findById); 

Спасибо за указатель!

person Steve Liu    schedule 30.07.2014