Проблемы с командой Mon goose findById - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть nodejs express маршрутизатор со следующим маршрутом:

router.get("/book/:id", function(req, res){

    Book.findById(req.params.id).then(function(book){
        if (book) {
            res.json(book);
        } else {
            res.send("Book Not found");
        }
    }).catch(function(err){
        if (err) {
            console.log(err);
            res.send(err);
            throw err;
        }
    })
})

, когда я проверяю маршрут с помощью почтальона, я всегда получаю эту ошибку:

  { [CastError: Cast to ObjectId failed for value "5e441654a8b2e25bfa3d4507" at path "_id" for model "Book"]
  stringValue: '"5e441654a8b2e25bfa3d4507"',
  kind: 'ObjectId',
  value: '5e441654a8b2e25bfa3d4507',
  path: '_id',
  reason: [TypeError: hex is not a function],
  message: 'Cast to ObjectId failed for value "5e441654a8b2e25bfa3d4507" at path "_id" for model "Book"',
  name: 'CastError',
  model: Model { Book } }

Это похоже, что команда findById запрашивает тип mon goose objectId, а не строку, которую я пробовал онлайн-решение (из стека и других сообществ), и я нашел что-то похожее на:

ObjectId = mongoose.Types.ObjectId
ObjectId = mongoose.Schema.ObjectId 
ObjectId = mongoose.mongo.ObjectId 

Тогда решение предлагает сделать что-то вроде:

id = new ObjectId(req.params.id)
Book.findById(id) 

Все еще не работает с hex is not a function ошибкой

Кто-нибудь сталкивался с этой ошибкой и удалось ее исправить? Обратите внимание, что я использую:

mongodb cloud hosting, version 4
mongoose 5.8.11
nodejs 4.2.6

и вот моя модель книги, если это поможет:

const schema = new mongoose.Schema({

       title: {
           type: String,
           require: true
       },
       author: {
            type: String,
            require: true
       },
       numberPages: {
            type: Number,
            require: false
       },
       publisher: {
           type: String,
           require: false
       }

});
module.exports = mongoose.model('Book', schema);

Ответы [ 3 ]

0 голосов
/ 12 февраля 2020

Вы должны передавать этот идентификатор в параметрах непосредственно в строку, как это id="5e441654a8b2e25bfa3d4507". Попробуйте пройти id=5e441654a8b2e25bfa3d4507 без кавычек.

0 голосов
/ 13 февраля 2020

Похоже, что драйвер узла вызывает проблему (выяснилось, что я использую старую версию узла 4.6), я обновил свою версию nodejs, и теперь она работает, спасибо всем.

0 голосов
/ 12 февраля 2020

Пожалуйста, попробуйте следующее:

var mongoose = require('mongoose');
...
var myId = new mongoose.Types.ObjectId(req.params.id)
Book.findById(myId).then(function(book) {
...

Это должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...