it-swarm.com.de

Mongoose: CastError: Umwandlung in ObjectId für Wert "[object Object]" unter Pfad "_id" fehlgeschlagen

Ich bin neu bei node.js, daher habe ich das Gefühl, dass dies etwas Dummes ist, das ich übersehen habe, aber ich konnte keine Antwort finden, die mein Problem behebt. Was ich versuche zu tun ist, einen Pfad zu erstellen, der ein neues untergeordnetes Objekt erstellt, es dem übergeordneten Kinder-Array hinzufügt und das untergeordnete Objekt an den Anforderer zurückgibt. Das Problem, auf das ich stoße, ist, dass, wenn ich die String-ID an findById übergeben, der Knoten abstürzt

TypeError: Objekt {} hat keine Methode 'cast'

Wenn ich versuche, stattdessen eine ObjectId zu übergeben, bekomme ich

CastError: Umwandlung in ObjectId für Wert "[object Object]" unter Pfad "_id" fehlgeschlagen

Hier ist eine grobe Übersicht meines Codes:

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 + "<br>" + JSON.stringify(id) || ("object '" + request.params.Id + "' not found: " + id)); return; }
    var child = ChildClass();
    myClass.Children.addToSet(child);
    myClass.save();
    result.send(child);
  });
});

Wenn ich diesen Code mit dem Pfad "/ myClass/51c35e5ced18cb901d000001/childClass/create" ausführen, ist dies die Ausgabe des Codes:

fehler: CastError: Umwandlung in ObjectId für Wert "[Object Object]" unter Pfad "_id" .__ fehlgeschlagen. {"Pfad": "51c35e5ced18cb901d000001", "Instanz": "ObjectID", "Validatoren": [], "Setter": [], "Getter": [], "_ Index": Null}

Ich habe versucht, findOne zu verwenden und stattdessen {_id: id} zu übergeben. Dies scheint jedoch genau das zu sein, was findById tut. Ich habe die verschiedenen Klassen für ObjectId ausprobiert, die auf anderen Websites aufgeführt wurden. Ich habe versucht, ObjectId () wie eine Funktion anstelle eines Konstruktors aufzurufen, und dies gibt undefined zurück. An diesem Punkt sind mir die Ideen ausgehen und es scheint nicht, dass das Googeln nach einer Antwort hilft. Irgendwelche Ideen, was ich falsch mache?

Wie ich bereits sagte, bin ich neu im Knoten/Mongo/Mongoose/Express. Wenn es also einen besseren Weg gibt, um mein Ziel zu erreichen, lass es mich wissen. Ich freue mich über jedes Feedback.

BEARBEITEN:

Nach der Problemumgehung von Peter Lyons googelte ich einen anderen Fehler, in den ich geraten war, und fand findByIdAndUpdate, das wie erwartet funktioniert und genau das tut, was ich gehofft hatte. Ich bin immer noch nicht sicher, warum findById und findOne mir solche Probleme gaben, und ich bin neugierig zu wissen (vielleicht muss ein Fehlerbericht eingereicht werden), also lasse ich dies offen, falls jemand anderes eine Antwort hat.

38
jmblackmer

Kurze Antwort: Verwenden Sie mongoose.Types.ObjectId.

Mongoose (aber nicht Mongo) können Objekt-IDs als Zeichenfolgen akzeptieren und sie "richtig" für Sie "werfen". Verwenden Sie einfach:

MyClass.findById(req.params.id)

Der Nachteil ist jedoch, wenn req.params.id kein gültiges Format für eine Mongo-ID-Zeichenfolge ist. Dies löst eine Ausnahme aus, die Sie abfangen müssen.

Es ist also verwirrend, dass mongoose.SchemaTypes nur Elemente enthält, die Sie nur beim Definieren von Moose-Schemas verwenden, und mongoose.Types das, was Sie beim Erstellen von Datenobjekten verwenden, die Sie in der Datenbank oder in Abfrageobjekten speichern möchten. mongoose.Types.ObjectId("51bb793aca2ab77a3200000d") funktioniert, gibt Ihnen ein Objekt, das Sie in der Datenbank speichern oder in Abfragen verwenden können, und gibt eine Ausnahme aus, wenn eine ungültige ID-Zeichenfolge angegeben wird.

findOne nimmt ein Abfrageobjekt und übergibt eine einzelne Modellinstanz an den Rückruf. Und findById ist buchstäblich ein Wrapper von findOne({_id: id}) ( siehe Quellcode hier ). Nur find nimmt ein Abfrageobjekt und übergibt ein Array übereinstimmender Modellinstanzen an den Rückruf.

Geh einfach langsam. Es ist verwirrend, aber ich kann Ihnen garantieren, dass Sie verwirrt werden und an diesem Punkt keine Fehler in Mungos schlagen. Es ist eine ziemlich ausgereifte Bibliothek, aber es braucht etwas Zeit, um den Dreh raus zu bekommen.

Die andere verdächtige Sache, die ich in Ihrem Snippet sehe, verwendet new nicht, wenn Sie ChildClass instanziiert. Darüber hinaus müssen Sie Ihren Schemacode bereitstellen, damit wir Ihnen helfen können, die verbleibenden CastErrors aufzuspüren.

56
Peter Lyons

Dieser Fehler ist aufgetreten. Der Wert, den Sie im Feld _id filtern möchten, ist nicht in einem ID-Format. Ein "Wenn" sollte dieses Problem lösen.

const mongoose = require('mongoose');

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

Um dies zu lösen, überprüfen Sie immer, ob der Kriterienwert für die Suche eine gültige ObjectId ist

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
})
16
gsalgadotoledo

Für all diese Leute blieb dieses Problem bestehen, konnte es aber immer noch nicht lösen: Ich stolperte über den gleichen Fehler und stellte fest, dass das _id-Feld leer war.

Ich habe es hier ausführlicher beschrieben. Habe immer noch keine Lösung gefunden, außer das Ändern der Felder in _id in Nicht-ID-Felder, was für mich ein schmutziger Hacker ist. Ich werde wahrscheinlich einen Fehlerbericht für Mungo einreichen. Jede Hilfe wäre dankbar!

Edit: Ich habe meinen Thread aktualisiert. Ich habe ein Ticket eingereicht und sie haben das fehlende _id-Problem bestätigt. Es wird in der 4.x.x-Version behoben, für die momentan ein Release-Kandidat verfügbar ist. Die rc wird nicht für den produktiven Einsatz empfohlen!

3
Stefan Medack

Wenn Sie dieses Problem haben und irgendwo entlang der Zeilen eine Bestückung durchführen, siehe diese Mongoose-Ausgabe .

Update auf Mongoose 4.0 und das Problem wurde behoben.

2
ac360

Hatte das gleiche Problem, ich habe nur die ID in einen String gezwungen.

Mein Schema:

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

Und dann beim Einfügen:

retailerID: `${retailer._id}`
2
camstuart

Ich habe diesen Fehler erhalten. CastError: Die Umwandlung in ObjectId ist für den Wert "[object Object]" im Pfad "_id" fehlgeschlagen, nachdem ein Schema erstellt, dann geändert und nicht gefunden wurde. Ich habe alle Dokumente in der Sammlung gelöscht und konnte 1 Objekt hinzufügen, aber kein zweites. Am Ende löschte ich die Sammlung in Mongo und das funktionierte, als Mongoose die Sammlung neu erstellte.

1
Enkode

Ich hatte das gleiche Problem. Schaltet aus, dass Node.js veraltet war. Nach dem Upgrade funktioniert es.

1
Rajesh Barik

Zum Protokoll: Ich hatte diesen Fehler beim Versuch, ein Filialdokument falsch auszufüllen:

{
[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 ist ein Array, das ein Objekt enthält: falsch!

Erläuterung: Ich habe auf folgende Weise Daten von PHP an eine node.js-API gesendet:

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

Wie Sie sehen, ist $ history ein Array, das ein Array enthält. Daher versucht mongoose, _id (oder ein anderes Feld) mit einem Array anstelle einer Scheme.ObjectId (oder einem anderen Datentyp) zu füllen. Die folgenden Arbeiten:

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

Ich bin auch auf diesen Fehler gestoßen. CastError: Die Umwandlung in ObjectId ist für den Wert "" 583fe2c488cf652d4c6b45d1\"am Pfad .__ fehlgeschlagen. "_ id" für den Modellbenutzer

Daher führe ich den Befehl npm list aus, um die Version von mongodb und mongoose in meinem lokalen ..__ zu überprüfen. Hier ist der Bericht: ......
......
├── [email protected]
├── [email protected]
..... 

Anscheinend gibt es ein Problem mit dieser Mongodb-Version. Ich deinstalliere sie und versuche, eine andere Version wie 2.2.16 zu verwenden

$ npm uninstall mongodb löscht den mongodb aus dem Verzeichnis node_modules. Danach installieren Sie die niedrigere Version von Mongodb.
$ npm install [email protected]
Zum Schluss starte ich die App neu und der CastError ist weg !!

0
Arman Ortega

Ändern Sie einfach den Pfad, der zum Beispiel funktionieren wird 

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

ändern 

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

Ich habe gerade --es-- zum Pfad (myClass) hinzugefügt, um (myClasses) zu werden.

sollte jetzt funktionieren und wird diesen Fehler nicht sehen

0
happyCoder