Mongoose: CastError: Cast naar ObjectId mislukt voor waarde “[object Object]” op pad “_id”

Ik ben nieuw bij node.js, dus ik heb het gevoel dat dit iets doms is dat ik over het hoofd heb gezien, maar ik heb geen antwoord kunnen vinden dat mijn probleem oplost. Wat ik probeer te doen, is een pad maken waarmee een nieuw kindobject wordt gemaakt, dit wordt toegevoegd aan de reeks kinderen van de ouder en vervolgens het onderliggende object terugstuurt naar de aanvrager. Het probleem waar ik tegenaan loop, is dat als ik de string-ID doorgeef aan findById, het knooppunt crasht met

TypeError: Object {} heeft geen methode ‘cast’

Als ik in plaats daarvan een ObjectId probeer door te geven, krijg ik

CastError: casten naar ObjectId mislukt voor waarde “[object Object]” op pad “_id”

Hier is een ruwe schets van mijn code:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId; //Have also tried Schema.Types.ObjectId, mongoose.ObjectId
mongoose.connect('mongodb://user:password@server: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 + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
    var child = ChildClass();
    myClass.Children.addToSet(child);
    myClass.save();
    result.send(child);
  });
});

Als ik deze code uitvoer met het pad “/myClass/51c35e5ced18cb901d000001/childClass/create”, is dit de uitvoer van de code:

fout: CastError: casten naar ObjectId mislukt voor waarde “[object Object]” op pad “_id”
{“path”:”51c35e5ced18cb901d000001″,”instance”:”ObjectID”,”validators”:[],”setters”:[],”getters”:[],”_index”:null}

Ik heb geprobeerd findOne te gebruiken en in plaats daarvan {_id:id} door te geven, maar dit lijkt precies te zijn wat findById doet. Ik heb de verschillende klassen voor ObjectId geprobeerd die ik op andere sites heb gezien. Ik heb geprobeerd ObjectId() aan te roepen als een functie in plaats van een constructor en dat geeft undefined terug. Op dit moment heb ik bijna geen ideeën meer en het lijkt erop dat Googlen naar een antwoord niet helpt. Enig idee wat ik verkeerd doe?

Ook, zoals ik al zei, ben ik nieuw in node/Mongo/Mongoose/Express, dus als er een betere manier is om mijn doel te bereiken, laat het me dan weten. Ik waardeer alle feedback.

BEWERKEN:

Na de tijdelijke oplossing van Peter Lyons googelde ik een andere fout die ik tegenkwam en vond findByIdAndUpdate, dat werkt zoals verwacht en precies doet wat ik hoopte te doen. Ik weet nog steeds niet zeker waarom findById en findOne me zulke problemen gaven en ik ben benieuwd (misschien moet er een bugrapport worden ingediend), dus ik laat dit open voor het geval iemand anders een antwoord heeft.


Antwoord 1, autoriteit 100%

Kort antwoord: gebruik mongoose.Types.ObjectId.

Mongoeste (maar niet mongo) kan object-ID’s als strings accepteren en ze op de juiste manier “casten”, dus gebruik gewoon:

MyClass.findById(req.params.id)

Het voorbehoud is echter dat als req.params.idgeen geldige indeling is voor een mongo-ID-tekenreeks, er een uitzondering ontstaat die u moet opvangen.

Dus het belangrijkste verwarrende om te begrijpen is dat mongoose.SchemaTypesdingen heeft die je alleen gebruikt bij het definiëren van mangoestschema’s, en mongoose.Typesheeft de dingen die je gebruikt bij het maken gegevensobjecten die u in de database wilt opslaan of queryobjecten. Dus mongoose.Types.ObjectId("51bb793aca2ab77a3200000d")werkt, geeft je een object dat je in de database kunt opslaan of in query’s kunt gebruiken, en zal een uitzondering genereren als een ongeldige ID-tekenreeks wordt gegeven.

findOneneemt een query-object en geeft een enkele modelinstantie door aan de callback. En findByIdis letterlijk een wrapper van findOne({_id: id})(zie hier de broncode). Gewoon findneemt een query-object en geeft een reeks overeenkomende modelinstanties door aan de callback.

Ga gewoon langzaam. Het is verwarrend, maar ik kan je garanderen dat je op dit moment in de war raakt en geen bugs in mangoest raakt. Het is een behoorlijk volwassen bibliotheek, maar het kost wat tijd om het onder de knie te krijgen.

Het andere verdachte dat ik in je fragment zie, is het niet gebruiken van newbij het instantiëren van ChildClass. Verder moet je je schemacode posten zodat we je kunnen helpen eventuele resterende CastErrors op te sporen.


Antwoord 2, autoriteit 59%

Ik heb met deze fout te maken gehad. Dat kwam omdat de waarde die u in het veld _id wilt filteren geen ID-indeling heeft, een “als” zou uw fout moeten oplossen.

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

Om het op te lossen, moet u altijd valideren of de waarde van het zoekcriterium een geldige ObjectId is

const criteria = {};
criteria.$or = [];
if(params.q) {
  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
})

Antwoord 3, autoriteit 6%

Voor al die mensen die vastzaten met dit probleem, maar het nog steeds niet konden oplossen: ik stuitte op dezelfde fout en ontdekte dat het veld _idleeg was.

Ik heb het hiermeer in detail. Ik heb nog steeds geen oplossing gevonden, behalve het wijzigen van de velden in _idnaar niet-ID-velden, wat voor mij een vuile hack is. Ik ga waarschijnlijk een bugrapport indienen voor mangoest. Alle hulp wordt op prijs gesteld!

Bewerken: ik heb mijn draad bijgewerkt. Ik heb een ticket ingediend en ze hebben het ontbrekende _id-probleem bevestigd. Het zal worden opgelost in de 4.x.x-versie waarvoor nu een release-kandidaat beschikbaar is. De rc wordt niet aanbevolen voor productief gebruik!


Antwoord 4, autoriteit 5%

Als je dit probleem hebt en je voert ergens in de trant van een populatie, bekijk deze Mongoose probleem.

Update naar Mongoose 4.0 en het probleem is opgelost.


Antwoord 5, autoriteit 3%

Had hetzelfde probleem, ik heb zojuist de id in een string geforceerd.

Mijn schema:

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

En dan, bij het invoegen:

retailerID: `${retailer._id}`

Antwoord 6, autoriteit 3%

Mijn oplossing is dat ik gegevens van alle documenten wil en geen _id, dus

User.find({}, {_id:0, keyToShow:1, keyToNotShow:0})

Antwoord 7, autoriteit 3%

Ik had hetzelfde probleem, maar nadat ik mijn schema had bijgewerkt, ben ik vergeten dat ik het model aanroep met de oude id, die door mij is gemaakt; Ik heb mijn schema geüpdatet van iets als:

patientid: {
           type: String,
            required: true,
            unique: true
          }, 

naar

patientid: { type: mongoose.SchemaTypes.ObjectId, ref: "Patient" },

Het bleek dat, aangezien mijn code groot is, ik de findOneaan het bellen was met de oude id, dus het probleem.

Ik post hier alleen maar om iemand anders te helpen: controleer je code op onbekende verkeerde oproepen! het kan het probleem zijn, en het kan je enorme hoofdakels redden!


Antwoord 8

Ik ontving deze fout CastError: Casten naar ObjectId mislukt voor waarde “[object Object]” op pad “_id” na het maken van een schema en het wijzigen ervan en kon het niet vinden. Ik heb alle documenten in de collectie verwijderd en ik kon 1 object toevoegen, maar geen tweede. Uiteindelijk heb ik de verzameling in Mongo verwijderd en dat werkte toen Mongoose de verzameling opnieuw maakte.


Antwoord 9

Voor de goede orde: ik kreeg de volgende fout bij het op een verkeerde manier vullen van een subdocument:

{
[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 is een array die een object bevat: fout!

Verklaring: ik verzond op deze manier gegevens van php naar een node.js API:

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

Zoals je kunt zien is $history een array die een array bevat. Dat is de reden waarom mangoesten proberen _id (of een ander veld) te vullen met een array in plaats van een Scheme.ObjectId (of een ander gegevenstype). De volgende werken:

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

Antwoord 10

Ik ben ook deze mangoest-fout CastError tegengekomen: casten naar ObjectId mislukt voor waarde \”583fe2c488cf652d4c6b45d1\” op pad
\”_id\” voor modelgebruiker

Dus ik voer de opdracht npm list uit om de mongodb- en mongoose-versie in mijn local te verifiëren.
Hier is het rapport:
……
……
├── [email protected]
├── [email protected]
…..

Het lijkt erop dat er een probleem is op deze MongoDB-versie, dus wat ik deed is dat ik de installatie ongedaan gemaakt en probeer te gebruiken verschillende versie zoals 2.2.16

$ npm uninstall mongodb, het zal de MongoDB verwijderen uit uw map Node_modules. Installeer de onderste versie van MongoDB.
$ npm install [email protected]
Eindelijk herstart ik de app en is de Csterror verdwenen !!


Antwoord 11

Ik had hetzelfde probleem. Turnt mijn knooppunt. Jsjs was verouderd. Na het upgraden is het werk.


Antwoord 12

Ik weet niet zeker of dit zal helpen, maar ik heb het probleem opgelost door mangoest te importeren zoals hieronder en implementeert het zoals hieronder

const mongoose = require('mongoose')
_id: new mongoose.Types.ObjectId(),

Antwoord 13

Wijzig gewoon het pad dat het bijvoorbeeld werkt

app.get('/myClass/:Id/childClass/create', function(request, result) .....

Wijzig in

app.get('/myClass**es**/:Id/childClass/create', function(request, result) .....

Ik heb gewoon –en –es toegevoegd aan het pad (MyClass) om (MyClasses)

te worden

Nu moeten werken en zal die fout niet zien


Antwoord 14

Voor mij was de ID ongedefinieerd (req.params.id keert niet gedefinieerd)

Other episodes