Mongoose: CastError: ObjectIdке трансляциялау «[object Object]» жолында «_id» жолында сәтсіз аяқталды

Мен node.js торабына жаңадан кірдім, сондықтан бұл менің ойымша, қисынсыз нәрсе болады деген сезім бар, бірақ менің проблемамды шешетін жауап таба алмадым. Мен жасамай тұрып, жаңа еншілес нысан жасайтын жолды жасайсыз, оны ата-аналық массивтерге қосып, содан кейін баланың нысанын сұраушыға қайтарыңыз. Мен іске асыратын мәселе, егер жолды id деп тапсам, findById ішіне кірсем, түйін бар

TypeError: Нысан {} әдісі 'шықты' жоқ.

Оның орнына ObjectId жолына өтуге тырысамын, аламын

CastError: ObjectID үшін трансляция «_id» жолында «[Object Object]» мәні үшін сәтсіз аяқталды

Міне, менің кодының қатал жоспары:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId

mongoose.connect('mongodb://user:[email protected]:port/database');

app.get('/myClass/:Id/childClass/create', function(request, result) {
  var id = new ObjectId(request.params.Id);
  MyClass.findById(id).exec( function(err, myClass) {
    if (err || !myClass) { result.send("error: " + err + "
" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; } var child = ChildClass(); myClass.Children.addToSet(child); myClass.save(); result.send(child); }); });

Егер осы кодты «/ myClass/51c35e5ced18cb901d000001/childClass/create» жолы арқылы орындасам, бұл кодтың шығысы:

қате: CastError: ObjectId-ге ауысу «_id» жолында «[Object Object]» мәніне сәтсіз аяқталды   [], «getters»: [], «_ index»: null}

Мен FindOne-ні қолданып, орнына {_id: id} өтіп көрдім, бірақ бұл дәл табылғанById жасайтын сияқты көрінеді. Мен басқа сайттарда тізілген көрген ObjectId үшін әртүрлі сыныптарды сынап көрдім. ObjectId() функциясын конструктордың орнына функция сияқты шақыру әрекетін жасадым және ол анықталмады. Осы сәтте мен идеялардан толып жатырмын және жауап беру үшін гоуглинг көмектеседі. Мен дұрыс емес әрекеттер туралы кез келген ойларым бар ма?

Сондай-ақ, айтқанымдай, мен/Mongo/Mongoose/Express торабына жаңалықтым, сондықтан менің мақсатыма жетудің жақсы жолы болса, мені хабарлаңыз. Барлық кері байланысты бағалаймын.

ӨҢДЕУ:

Питер Лионстың шешімінен кейін, мен тағы бір қателікке бардым, ол мен іске кірді және табуға болатын нәрсені істейтін нәрсе ретінде жұмыс істейтін деп тапты. Мен тағы да білмеймін, неге FindById және findOne маған осындай мәселелерді беріп жатқанын білемін және білемін (мүмкін, қате туралы есеп беру қажет болуы мүмкін), сондықтан мен басқа біреудің жауап беруі үшін ашық қалдырамын.

30
Менің болжауымша, findOne деген бір кодты ObjectId деп қосты, бірақ findOne кілт/мән шарттарының тұрақты JS нысанын күтеді.
қосылды автор Peter Lyons, көзі
Менің болжауымша, findOne деген бір кодты ObjectId деп қосты, бірақ findOne кілт/мән шарттарының тұрақты JS нысанын күтеді.
қосылды автор Peter Lyons, көзі

17 жауаптар

Қысқа жауап: mongoose.Types.ObjectId пайдаланыңыз.

Mongoose (бірақ mongo емес) идентификаторларды жолдар ретінде қабылдай алады және оларды сіз үшін дұрыс «тастау» мүмкін, сондықтан жай ғана пайдаланыңыз:

MyClass.findById(req.params.id)

Дегенмен, req.params.id - маңғадағы mongo ID жолына жарамды пішім болмаса, бұл сізді ұстау керек болатын ерекше жағдайды тастайды.

mongoose.SchemaTypes - сіз түсіндіре алатын басты шатастырғыш нәрсе - бұл тек mongoose схемаларын анықтаған кезде қолданатын заттарыңыз бар және mongoose.Types - сізде деректер объектілерін дерекқорда немесе сұрау нысандарында сақтау керек. mongoose.Types.ObjectId («51bb793aca2ab77a3200000d») жұмыс істейді, сізге дерекқорда сақтауға немесе сұрауда пайдалануға болатын нысанды береді және егер жарамсыз идентификатор жолын берсе, ерекше жағдайды шығарады.

findOne takes a query object and passes a single model instance to the callback. And findById is literally a wrapper of findOne({_id: id}) (see source code here). Just find takes a query object and passes an array of matching model instances to the callback.

Жай баяу жүріңіз. Бұл шатастырып жатыр, бірақ мен бұл сәтте mongoose-дегі қателіктерге ұшырамай, шатастырып жатқаныңызға кепілдік бере аламын. Бұл әдемі жетілген кітапхана, бірақ оны алу үшін уақыт кетеді.

ChildClass жасаған кезде сіздің үзіндіде көрген басқа күдікті нәрсе new пайдаланбайды. Бұдан басқа, сіз қалаған кез келген CastErrors-ді жоюға көмектесу үшін схема кодын орналастыруыңыз керек.

45
қосылды
2014 жылдың 3 шілдесіне дейін жұмыс істемейді !! new mongoose.Schema.ObjectId («51bb793aca2ab77a3200000d») жұмыс істейді, бірақ new mongoose.Schema.ObjectId (request.params [0]) қатені шығарады? /51bb793aca2ab77a3200000d ішінде «51bb793aca2ab77a3200000d» жолын орналастырамын. Және url-дан алынған қатені жібереді.
қосылды автор Green, көзі
Сіз дұрыс конструктор функциясын қолданасыз. mongoose.Types.ObjectId пайдаланыңыз. mongoose.Schema.ObjectId - тек схемаларды анықтауға арналған.
қосылды автор Peter Lyons, көзі
Ең соңғы mongoose-ға жаңарту керек пе? Мен 3.6.11-де.
қосылды автор Peter Lyons, көзі
Рахмет, мені дұрыс бағытта көрсеттіңіз.
қосылды автор Willa, көзі
Call MyClass.find (req.params.id) жұмыс істейді. Бірдей табу керек емес пе? Басқа екеу болғанда бір құжатты қайтаратын функция табу үшін біршама қарсы - интуитивті көрінеді. Мен қазір алаптың бірінші элементін алу үшін кодты өзгертіп қойдым, бірақ addToSet() жүйесінде «TypeError: Object {} әдісі жоқ» дегенді білдіреді.
қосылды автор jmblackmer, көзі
Мен 3.6.11-де. Мен мұны тек түнде қалдырып қойдым, сондықтан бәрі қазірдің өзінде жаңартылған деп күтемін.
қосылды автор jmblackmer, көзі
Мен «mongoose.Types.ObjectId (» 51c35e5ced18cb901d000001 «);» (оны тікелей кодпен орналастыру арқылы), «Типтейррор: Объект {} ешқандай әдісі жоқ» деген қатені аламын «. Мен сондай-ақ оны объект ретінде жасамауға тырыстым және сол қатені таптым.
қосылды автор jmblackmer, көзі

Қысқа жауап: mongoose.Types.ObjectId пайдаланыңыз.

Mongoose (бірақ mongo емес) идентификаторларды жолдар ретінде қабылдай алады және оларды сіз үшін дұрыс «тастау» мүмкін, сондықтан жай ғана пайдаланыңыз:

MyClass.findById(req.params.id)

Дегенмен, req.params.id - маңғадағы mongo ID жолына жарамды пішім болмаса, бұл сізді ұстау керек болатын ерекше жағдайды тастайды.

mongoose.SchemaTypes - сіз түсіндіре алатын басты шатастырғыш нәрсе - бұл тек mongoose схемаларын анықтаған кезде қолданатын заттарыңыз бар және mongoose.Types - сізде деректер объектілерін дерекқорда немесе сұрау нысандарында сақтау керек. mongoose.Types.ObjectId («51bb793aca2ab77a3200000d») жұмыс істейді, сізге дерекқорда сақтауға немесе сұрауда пайдалануға болатын нысанды береді және егер жарамсыз идентификатор жолын берсе, ерекше жағдайды шығарады.

findOne takes a query object and passes a single model instance to the callback. And findById is literally a wrapper of findOne({_id: id}) (see source code here). Just find takes a query object and passes an array of matching model instances to the callback.

Жай баяу жүріңіз. Бұл шатастырып жатыр, бірақ мен бұл сәтте mongoose-дегі қателіктерге ұшырамай, шатастырып жатқаныңызға кепілдік бере аламын. Бұл әдемі жетілген кітапхана, бірақ оны алу үшін уақыт кетеді.

ChildClass жасаған кезде сіздің үзіндіде көрген басқа күдікті нәрсе new пайдаланбайды. Бұдан басқа, сіз қалаған кез келген CastErrors-ді жоюға көмектесу үшін схема кодын орналастыруыңыз керек.

45
қосылды
2014 жылдың 3 шілдесіне дейін жұмыс істемейді !! new mongoose.Schema.ObjectId («51bb793aca2ab77a3200000d») жұмыс істейді, бірақ new mongoose.Schema.ObjectId (request.params [0]) қатені шығарады? /51bb793aca2ab77a3200000d ішінде «51bb793aca2ab77a3200000d» жолын орналастырамын. Және url-дан алынған қатені жібереді.
қосылды автор Green, көзі
Сіз дұрыс конструктор функциясын қолданасыз. mongoose.Types.ObjectId пайдаланыңыз. mongoose.Schema.ObjectId - тек схемаларды анықтауға арналған.
қосылды автор Peter Lyons, көзі
Ең соңғы mongoose-ға жаңарту керек пе? Мен 3.6.11-де.
қосылды автор Peter Lyons, көзі
Рахмет, мені дұрыс бағытта көрсеттіңіз.
қосылды автор Willa, көзі
Call MyClass.find (req.params.id) жұмыс істейді. Бірдей табу керек емес пе? Басқа екеу болғанда бір құжатты қайтаратын функция табу үшін біршама қарсы - интуитивті көрінеді. Мен қазір алаптың бірінші элементін алу үшін кодты өзгертіп қойдым, бірақ addToSet() жүйесінде «TypeError: Object {} әдісі жоқ» дегенді білдіреді.
қосылды автор jmblackmer, көзі
Мен 3.6.11-де. Мен мұны тек түнде қалдырып қойдым, сондықтан бәрі қазірдің өзінде жаңартылған деп күтемін.
қосылды автор jmblackmer, көзі
Мен «mongoose.Types.ObjectId (» 51c35e5ced18cb901d000001 «);» (оны тікелей кодпен орналастыру арқылы), «Типтейррор: Объект {} ешқандай әдісі жоқ» деген қатені аламын «. Мен сондай-ақ оны объект ретінде жасамауға тырыстым және сол қатені таптым.
қосылды автор jmblackmer, көзі

Мен бұл қатеге тап болдым, себебі _id өрісінде сүзгісі келетін мән ID форматында болмағандықтан, «if» осы мәселені шешуі керек болды.

const mongoose = require('mongoose');

console.log(mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943'));
// true
console.log(mongoose.Types.ObjectId.isValid('whatever'));
// false

Шешу үшін, іздеу үшін критерий мәні жарамды ObjectId болып табылатынын әрдайым тексеріңіз

if(params.q) {
  criteria.$or = []
  if(mongoose.Types.ObjectId.isValid(params.id)) {
    criteria.$or.push({ _id: params.q })
  }
  criteria.$or.push({ name: { $regex: params.q, $options: 'i' }})
  criteria.$or.push({ email: { $regex: params.q, $options: 'i' }})
  criteria.$or.push({ password: { $regex: params.q, $options: 'i' }})
}

return UserModule.find(criteria).exec(() => {
 //do stuff
})
8
қосылды

Мен бұл қатеге тап болдым, себебі _id өрісінде сүзгісі келетін мән ID форматында болмағандықтан, «if» осы мәселені шешуі керек болды.

const mongoose = require('mongoose');

console.log(mongoose.Types.ObjectId.isValid('53cb6b9b4f4ddef1ad47f943'));
// true
console.log(mongoose.Types.ObjectId.isValid('whatever'));
// false

Шешу үшін, іздеу үшін критерий мәні жарамды ObjectId болып табылатынын әрдайым тексеріңіз

if(params.q) {
  criteria.$or = []
  if(mongoose.Types.ObjectId.isValid(params.id)) {
    criteria.$or.push({ _id: params.q })
  }
  criteria.$or.push({ name: { $regex: params.q, $options: 'i' }})
  criteria.$or.push({ email: { $regex: params.q, $options: 'i' }})
  criteria.$or.push({ password: { $regex: params.q, $options: 'i' }})
}

return UserModule.find(criteria).exec(() => {
 //do stuff
})
8
қосылды

Барлық адамдар үшін бұл проблема болды, бірақ бәрібір оны шеше алмады: мен бірдей қатеге тап болдым және _id өрісінің бос екендігін таптым.

Мен оны мұнда қараңыз. бөлшектер. _id өрістерін өзгертпестен басқа шешім табылмады. Мені лас емес бұзу болып табылмайтын өріс идентификаторларына. Менің ойымша, mongoose үшін қате туралы есеп беруім керек. Кез келген көмекті бағалайтын болар еді!

Өңдеу: Мен өзімнің жаңалықты жаңарттым. Мен билетті тапсырдым және олар _id жоғалғандығын растады. Ол қазір қол жетімді үміткер бар 4.x.x нұсқасында бекітіледі. Rc өнімді пайдалану үшін ұсынылмайды!

3
қосылды
қызықты, менің ойымша, менде бірдей мәселе бар, менің түсініксіз болдым, сондықтан ObjectId-ге ауыса алмадым
қосылды автор Alexander Mills, көзі

Барлық адамдар үшін бұл проблема болды, бірақ бәрібір оны шеше алмады: мен бірдей қатеге тап болдым және _id өрісінің бос екендігін таптым.

Мен оны мұнда қараңыз. бөлшектер. _id өрістерін өзгертпестен басқа шешім табылмады. Мені лас емес бұзу болып табылмайтын өріс идентификаторларына. Менің ойымша, mongoose үшін қате туралы есеп беруім керек. Кез келген көмекті бағалайтын болар еді!

Өңдеу: Мен өзімнің жаңалықты жаңарттым. Мен билетті тапсырдым және олар _id жоғалғандығын растады. Ол қазір қол жетімді үміткер бар 4.x.x нұсқасында бекітіледі. Rc өнімді пайдалану үшін ұсынылмайды!

3
қосылды
қызықты, менің ойымша, менде бірдей мәселе бар, менің түсініксіз болдым, сондықтан ObjectId-ге ауыса алмадым
қосылды автор Alexander Mills, көзі

Егер сіз бұл мәселені шешіп жүрсеңіз және сіз кез-келген жерде бір жолда жүрсеңіз, Бұл Mongoose мәселесін қараңыз .

Mongoose 4.0-ке жаңарту және мәселе шешілді.

3
қосылды

Егер сіз бұл мәселені шешіп жүрсеңіз және сіз кез-келген жерде бір жолда жүрсеңіз, Бұл Mongoose мәселесін қараңыз .

Mongoose 4.0-ке жаңарту және мәселе шешілді.

3
қосылды

Бірдей мәселе болғанда, мен өзімді тек жолға айналдырдым.

Менің схемам:

const product = new mongooseClient.Schema({
    retailerID: { type: mongoose.SchemaTypes.ObjectId, required: true, index: true }
});

Содан кейін, кірістіру кезінде:

retailerID: `${retailer._id}`
2
қосылды

Бірдей мәселе болғанда, мен өзімді тек жолға айналдырдым.

Менің схемам:

const product = new mongooseClient.Schema({
    retailerID: { type: mongoose.SchemaTypes.ObjectId, required: true, index: true }
});

Содан кейін, кірістіру кезінде:

retailerID: `${retailer._id}`
2
қосылды

Жазба үшін: Менде осы құжатты дұрыс емес түрде толтыруға тырысқан қате болды:

{
[CastError: Cast to ObjectId failed for value "[object Object]" at path "_id"]
message: 'Cast to ObjectId failed for value "[object Object]" at path "_id"',
name: 'CastError',
type: 'ObjectId',
path: '_id'
value:
  [ { timestamp: '2014-07-03T00:23:45-04:00',
  date_start: '2014-07-03T00:23:45-04:00',
  date_end: '2014-07-03T00:23:45-04:00',
  operation: 'Deactivation' } ],
}

look ^ value - объекті бар массив: дұрыс емес!

Түсіндіру: php-дан node.js API-ге деректерді келесі жолмен жібердім:

$history = json_encode(
array(
  array(
  'timestamp'  => date('c', time()),
  'date_start' => date('c', time()),
  'date_end'   => date('c', time()),
  'operation'  => 'Deactivation'
)));

$ Тарихын көріп отырғандай, массив массиві бар. Міне, сондықтан mongoose _id (немесе кез келген басқа өрісті) Scheme.ObjectId (немесе кез келген басқа деректер түрі) орнына жиыммен толтыруға тырысады. Келесі жұмыстар:

$history = json_encode(
array(
  'timestamp'  => date('c', time()),
  'date_start' => date('c', time()),
  'date_end'   => date('c', time()),
  'operation'  => 'Deactivation'
));
1
қосылды

Жазба үшін: Менде осы құжатты дұрыс емес түрде толтыруға тырысқан қате болды:

{
[CastError: Cast to ObjectId failed for value "[object Object]" at path "_id"]
message: 'Cast to ObjectId failed for value "[object Object]" at path "_id"',
name: 'CastError',
type: 'ObjectId',
path: '_id'
value:
  [ { timestamp: '2014-07-03T00:23:45-04:00',
  date_start: '2014-07-03T00:23:45-04:00',
  date_end: '2014-07-03T00:23:45-04:00',
  operation: 'Deactivation' } ],
}

look ^ value - объекті бар массив: дұрыс емес!

Түсіндіру: php-дан node.js API-ге деректерді келесі жолмен жібердім:

$history = json_encode(
array(
  array(
  'timestamp'  => date('c', time()),
  'date_start' => date('c', time()),
  'date_end'   => date('c', time()),
  'operation'  => 'Deactivation'
)));

$ Тарихын көріп отырғандай, массив массиві бар. Міне, сондықтан mongoose _id (немесе кез келген басқа өрісті) Scheme.ObjectId (немесе кез келген басқа деректер түрі) орнына жиыммен толтыруға тырысады. Келесі жұмыстар:

$history = json_encode(
array(
  'timestamp'  => date('c', time()),
  'date_start' => date('c', time()),
  'date_end'   => date('c', time()),
  'operation'  => 'Deactivation'
));
1
қосылды

Мен осы қатені алдым CastError: ObjectId-ға көшіру схеманы жасағаннан кейін «_id» жолында «[object Object]» мәніне сәтсіздікке ұшырады, содан кейін оны өзгертіп, оны қадағалай алмады. Жинақта барлық құжаттарды жойып жібердім және 1 объектті қоссам да, екінші емес. Мен Монгодағы коллекцияны жоюды аяқтадым және Mongoose коллекцияны қайта құрды.

1
қосылды

Менде сол проблема болды. Node.js ескірген ескірген. Жаңартудан кейін ол жұмыс істейді.

1
қосылды

Менде сол проблема болды. Node.js ескірген ескірген. Жаңартудан кейін ол жұмыс істейді.

1
қосылды

Сондай-ақ, бұл mongoose қатесіне тап болдым: CastError: ObjectId үшін трансляция жолында \ «583fe2c488cf652d4c6b45d1 \» мәніне сәтсіз аяқталды  Пайдаланушы үшін «_ id \»

Сондықтан мен жергілікті тілде mongodb және mongoose нұсқасын тексеру үшін npm list командасын орындаймын. Баяндамада: ......
......
├─ [email protected]
[email protected]
тегін нұсқаулары .....

Менің ойымша, бұл mongodb нұсқасында мәселе бар сияқты, сондықтан мен не істеп жатырмын, оны жоюға тырысамын және 2.2.16

$ npm uninstall mongodb, it will delete the mongodb from your node_modules directory. After that install the lower version of mongodb.
$ npm install [email protected]
Finally, I restart the app and the CastError is gone!!

0
қосылды

Сондай-ақ, бұл mongoose қатесіне тап болдым: CastError: ObjectId үшін трансляция жолында \ «583fe2c488cf652d4c6b45d1 \» мәніне сәтсіз аяқталды  Пайдаланушы үшін «_ id \»

Сондықтан мен жергілікті тілде mongodb және mongoose нұсқасын тексеру үшін npm list командасын орындаймын. Баяндамада: ......
......
├─ [email protected]
[email protected]
тегін нұсқаулары .....

Менің ойымша, бұл mongodb нұсқасында мәселе бар сияқты, сондықтан мен не істеп жатырмын, оны жоюға тырысамын және 2.2.16

$ npm uninstall mongodb, it will delete the mongodb from your node_modules directory. After that install the lower version of mongodb.
$ npm install [email protected]
Finally, I restart the app and the CastError is gone!!

0
қосылды