Wenn das Senden einer Anfrage an /customers/41224d776a326fb40f000001
und ein Dokument mit _id
41224d776a326fb40f000001
nicht vorhanden ist, doc
ist null
und ich ein 404
:
Controller.prototype.show = function(id, res) {
this.model.findById(id, function(err, doc) {
if (err) {
throw err;
}
if (!doc) {
res.send(404);
}
return res.send(doc);
});
};
Wenn _id
jedoch nicht das übereinstimmt, was Mongoose als "Format" erwartet (nehme ich an), wird beispielsweise GET /customers/foo
ein seltsamer Fehler zurückgegeben:
CastError: Die Umwandlung in ObjectId ist für den Wert "foo" im Pfad "_id" fehlgeschlagen.
Was ist dieser Fehler?
_id
in Ihrem Mongoose-Schema verwendet werden soll. In dem"bla"
Fall würden Sie einen Typ vonString
anstelle des Standardtyps verwendenObjectId
und müssten diese Prüfung nicht hinzufügen, da alles in eine Zeichenfolge umgewandelt werden kann.ObjectId
aus einer bestimmten Zeichenfolge (aus derGET
Anforderung) eine neue erstellen, um sie an diefindById
Methode zu übergeben?ObjectId("000000000000") --> 303030303030303030303030
Verwenden Sie vorhandene Funktionen zum Überprüfen der ObjectID.
quelle
'your id here'
Beispiel gibt es sogar true zurück . github.com/mongodb/js-bson/issues/106Analysieren Sie diese Zeichenfolge als
ObjectId
?Hier in meiner Bewerbung mache ich Folgendes:
quelle
mongoose.Types.ObjectId
.fromString
ist keine FunktionIch habe das gleiche Problem, das ich
_id: String .in Schema hinzufüge, dann fängt es an zu arbeiten
quelle
Ich musste meine Routen über andere Routen verschieben, die die Routenparameter erfassen:
quelle
Am besten überprüfen Sie die Gültigkeit
quelle
In meinem Fall musste ich
_id: Object
meinem Schema hinzufügen , und dann funktionierte alles einwandfrei.quelle
Sie können ObjectId.isValid auch wie folgt verwenden:
quelle
quelle
Stand 19. November 2019
Sie können
isValidObjectId(id)
ab Mungo Version 5.7.12 verwendenhttps://mongoosejs.com/docs/api/mongoose.html#mongoose_Mongoose-isValidObjectId
quelle
Ich habe mich für eine Anpassung der @gustavohenke-Lösung entschieden und Cast ObjectId in einem Try-Catch implementiert, der um den Originalcode gewickelt ist, um den Fehler des ObjectId-Castings als Validierungsmethode zu nutzen.
quelle
Dies ist eine alte Frage, aber Sie können auch das Express-Validator-Paket verwenden, um Anforderungsparameter zu überprüfen
Express-Validator Version 4 (neueste Version):
Express-Validator Version 3:
quelle
Verwenden
mongoose.Types.ObjectId('your id')
Sie diese Option immer für Bedingungen in Ihrer Abfrage. Dadurch wird das ID-Feld überprüft, bevor Ihre Abfrage ausgeführt wird. Dadurch stürzt Ihre App nicht ab.quelle
Ich war kürzlich mit etwas Ähnlichem konfrontiert und habe es gelöst, indem ich den Fehler abgefangen habe, um herauszufinden, ob es sich um einen Mongoose ObjectId-Fehler handelt.
quelle
ODER Sie können dies tun
var ObjectId = require('mongoose').Types.ObjectId; var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
Wie hier erwähnt, funktioniert Mongooses Suchmethode mit $ oder Bedingung nicht richtig
quelle
Die Art und Weise, wie ich dieses Problem behebe, besteht darin, die ID in einen String umzuwandeln
Ich mag es schick mit Backtick:
`${id}`
Dies sollte das Problem ohne Overhead beheben
quelle
ObjectId besteht aus folgenden Dingen.
Die korrekte Methode zum Überprüfen, ob die objectId gültig ist, besteht in der Verwendung der statischen Methode aus der ObjectId-Klasse.
mongoose.Types.ObjectId.isValid (sample_object_id)
quelle
Zeichenfolge in ObjectId umwandeln
quelle
Erkennen und Korrigieren des ObjectID-Fehlers
Ich bin auf dieses Problem gestoßen, als ich versucht habe, ein Element mit Mungo zu löschen, und habe denselben Fehler erhalten. Nachdem ich mir die Rückgabezeichenfolge angesehen hatte, stellte ich fest, dass in der zurückgegebenen Zeichenfolge einige zusätzliche Leerzeichen vorhanden waren, die den Fehler für mich verursachten. Daher habe ich einige der hier angegebenen Antworten angewendet, um die fehlerhafte ID zu erkennen und dann die zusätzlichen Leerzeichen aus der Zeichenfolge zu entfernen. Hier ist der Code, der für mich funktioniert hat, um das Problem endgültig zu beheben.
Dies hat bei mir funktioniert und ich gehe davon aus, dass andere Elemente, die in der Rückgabezeichenfolge angezeigt werden, auf ähnliche Weise entfernt werden können.
Ich hoffe das hilft.
quelle
Ich habe dieses Problem behoben, indem ich die Reihenfolge der Routen geändert habe.
quelle