LINUX.ORG.RU

mongoose findById не работает.

 , , ,


0

1

Прошу сильно не пинать.
Изучаю nodejs, express и mongodb
Попутно пытаюсь сделать все что показано в этом скринкасте
Но в этом месте:

app.get('/user/:id', function(req, res, next){
  User.findById(req.params.id, function(err, user){
    if(err) return next(err);
    res.json(user);
  });
});
Вываливается ошибка:

Express
500 CastError: Cast to ObjectId failed for value "586f2862632df73c31f25df3" at path "_id" for model "User"
   at MongooseError.CastError (/home/farex/dev/nodejs_dev/lessons_30/node_modules/mongoose/lib/error/cast.js:26:11)
   at ObjectId.cast (/home/farex/dev/nodejs_dev/lessons_30/node_modules/mongoose/lib/schema/objectid.js:147:13)
   at ObjectId.castForQuery (/home/farex/dev/nodejs_dev/lessons_30/node_modules/mongoose/lib/schema/objectid.js:187:15)
   at cast (/home/farex/dev/nodejs_dev/lessons_30/node_modules/mongoose/lib/cast.js:229:32)
   at Query.cast (/home/farex/dev/nodejs_dev/lessons_30/node_modules/mongoose/lib/query.js:2752:12)
   at Query.findOne (/home/farex/dev/nodejs_dev/lessons_30/node_modules/mongoose/lib/query.js:1353:10)
   at Function.findOne (/home/farex/dev/nodejs_dev/lessons_30/node_modules/mongoose/lib/model.js:1343:13)
   at Function.findById (/home/farex/dev/nodejs_dev/lessons_30/node_modules/mongoose/lib/model.js:1271:15)
   at /home/farex/dev/nodejs_dev/lessons_30/app.js:42:8
   at callbacks (/home/farex/dev/nodejs_dev/lessons_30/node_modules/express/lib/router/index.js:164:37)
   at param (/home/farex/dev/nodejs_dev/lessons_30/node_modules/express/lib/router/index.js:138:11)
   at param (/home/farex/dev/nodejs_dev/lessons_30/node_modules/express/lib/router/index.js:135:11)
   at pass (/home/farex/dev/nodejs_dev/lessons_30/node_modules/express/lib/router/index.js:145:5)
   at Router._dispatch (/home/farex/dev/nodejs_dev/lessons_30/node_modules/express/lib/router/index.js:173:5)
   at Object.router (/home/farex/dev/nodejs_dev/lessons_30/node_modules/express/lib/router/index.js:33:10)
   at next (/home/farex/dev/nodejs_dev/lessons_30/node_modules/connect/lib/proto.js:174:15)

Похоже в новой версии mobgoose, что-то поменялось...


Ответ на: комментарий от Anatolik

Только вместо прямого вызова `new ObjectId()` лучше врапер с try/catch и проверкой результата. Иначе при не валидных данных будет бабахать эксепшен мимо колбеков.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Не могу разобраться.
Привел код к таком виду:

var mongoose = require('mongoose')
var ObjectId = mongoose.Schema.Types.ObjectId;

app.get('/user/:id', function(req, res, next){
    var param = req.param[this.name + 'Id'];
    var search = {'_id': new ObjectId(param)};
User.findById(search, function(err, user){
    if(err) return next(err);
    res.json(user);
  });
});
Все равно не работает... я чего-то недопонимаю... Разъясните пожалуйста.

farex
() автор топика
Ответ на: комментарий от farex

Да. Либо даже просто не создавать search, а сразу конвертировать ваш параметр, как здесь:

var id = ObjectId(req.params.id)

Вы скопировали со stackoverflow строку

var param = req.param[this.name + 'Id'];
которая вам не нужна.

Anatolik ★★
()
Ответ на: комментарий от Vit

Не очень удобно. В Mongoid можно сделать

Mongoid.raise_not_found_error = false
и тогда будет вместо ошибки Mongoid::Errors::DocumentNotFound просто отдавать nil.

И строки Mongoid тоже автоматически в ObjectId конвертирует.

Anatolik ★★
()
Ответ на: комментарий от Anatolik
app.get('/user/:id', function(req, res, next){
    var id = ObjectId(req.params.id);
    console.log(id);
    User.findById(id, function(err, user){
    if(err) return next(err);
    res.json(user);
  });
});

console.log(id) выдает:

undefined

farex
() автор топика
Ответ на: комментарий от farex

Сделал даже так:

app.get('/user/:id', function(req, res, next){
    var id = ObjectId('586f2862632df73c31f25df2');
    console.log(id);
    User.findById(id, function(err, user){
    if(err) return next(err);
    res.json(user);
  });
});
Все равно ответ null, не находит пользователя.

farex
() автор топика

лучше начать с голого драйвера mongo, освоить технологию, разобраться с апи. mongoose - тормозное поделие без профитов со своим api от балды.

anonymous
()
Ответ на: комментарий от farex

в консоли mongo db.users.findOne({_id: ObjectId(" что вернет? вам бы сначала отладку освоить, а потом в асинхронные дебри нырять

anonymous
()
Ответ на: комментарий от farex

у вас ObjectId это разве BSON'новский класс? Это дескриптор типа для описания схемы документа. Начните с изучения mongo без mongoose & express.

anonymous
()
Ответ на: комментарий от anonymous

db.users.findOne()

{
	"_id" : ObjectId("586f2862632df73c31f25df2"),
	"username" : "Вася",
	"hashedPassword" : "cc4c5d195b9e1956f2f80eb34db23f85c3b3e02d",
	"salt" : "0.6767356628552079",
	"created" : ISODate("2017-01-06T05:17:22.458Z"),
	"__v" : 0
}
farex
() автор топика
Последнее исправление: farex (всего исправлений: 1)
Ответ на: комментарий от farex

ObjectID = require('mongodb').ObjectID

запомните, если что-то не работает, значит ошибку допустили Вы. ошибки в технологии, в вашем случае, исключены. начните с простого, с примеров в консоли.

anonymous
()
Ответ на: комментарий от farex

Я следовал примеру из урока, у автора все один в один написано, но у него работает.

Тогда лучше используйте ту же версию mongoose, что и у автора. Похоже, в mongoose часто что-то меняется.

Anatolik ★★
()
Ответ на: комментарий от Anatolik

Меня уже тоже эта мысль посетила.

farex
() автор топика
Ответ на: комментарий от farex

это вы ему через плечо заглядывали и видели что работает, или на слово поверили? очевидно что вы не понимаете что делаете, сравните код Objectid из этих пакетов и убедитесь.

anonymous
()
Ответ на: комментарий от Anatolik

Собственно помогло:
mongodb 3 версия.
mongoose 2 версия.
Всем спасибо за советы

farex
() автор топика
Ответ на: комментарий от Vit

Лучше вообще использовать async/await уже наконец, с нормальной обработкой ошибок вместо протаскивания руками через колбеки же. У меня на календаре 2017.

ChALkeR ★★★★★
()
Ответ на: комментарий от farex

А, ещё (анрелейтед) стоит использовать const/let вместо var и подключить eslint, который это (и многое другое) проверяет.

ChALkeR ★★★★★
()
Ответ на: комментарий от ChALkeR

Спасибо за советы, но я еще только учусь.Был бы рад конкретным примерам.

farex
() автор топика
Ответ на: комментарий от menangen

лет 7 назад использовал это в расширении iced-coffee-script, - работало

anonymous
()
Ответ на: комментарий от menangen

нет. в ес7 только две фичи: array.includes и x ** y. а это лишь один из вариантов замены коллбеков. очевидно, синтаксис async/await более привычен и близок к другим языкам

anonymous
()
Ответ на: комментарий от anonymous

Если этой фичи нет в стандарте, тогда зачем о ней говорить?

menangen ★★★★★
()
Ответ на: комментарий от farex

http://mongoosejs.com/docs/api.html#model_Model.findById

Вообще вроде и строки должно хавать, судя по документации. В console.log() выведите реальное значение, может из экспресса мусор прет.

Примеры, честно говоря, старые. Я сильно сомневаюсь, что автор сейчас стал бы хреначить колбеками. Ну и про то что на кривом урле эксепшены в космос улетят в таком коде я уже объяснял.

Vit ★★★★★
()
Последнее исправление: Vit (всего исправлений: 1)
Ответ на: комментарий от ChALkeR

bluebird Coroutine + yield наше всё. Пока async/await без ключиков хотя бы в 7 версии не заработет - в жопу такое счастье.

Vit ★★★★★
()
Ответ на: комментарий от Vit

А чем тебе бабель не угодил?

На йелдах писать чтобы через несколько месяцев всё переписывать? Зачем?

По поводу async/await 7 — там это зависит от того, получится ли v8 5.5 в 7 ветку посадить, не сломав совместимость. Я бы сказал, что скорее нет, но я могу ошибаться — надо смотреть внимательнее, после того, как в мастер войдёт. В 8.0.0 в апреле точно будет.

ChALkeR ★★★★★
()
Последнее исправление: ChALkeR (всего исправлений: 2)
Ответ на: комментарий от menangen

Если придерживаться такой терминологии, то это ES8. Но вообще-то он ECMAScript 2017.

И нет, это не драфт, спецификация async/await полностью завершена, принята, и войдёт в стандарт в этом году.

ChALkeR ★★★★★
()
Последнее исправление: ChALkeR (всего исправлений: 1)
Ответ на: комментарий от ChALkeR

Как-то не прет препроцессить код на сервере.

Восьмерка пойдет. А разве туда станут новые фичи втягивать? Она же LTS.

Vit ★★★★★
()
Ответ на: комментарий от Vit

Как-то не прет препроцессить код на сервере.

Почему?

А разве туда станут новые фичи втягивать? Она же LTS.

Восьмёрка не LTS изначально, она станет LTS только через полгода после выхода, в октябре, одновременно с выходом 9.0.0. Ознакомься с https://github.com/nodejs/LTS.

ChALkeR ★★★★★
()
Последнее исправление: ChALkeR (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.