Gdy wysyłam zapytanie do, /customers/41224d776a326fb40f000001
a dokument z którym _id
41224d776a326fb40f000001
nie ma, doc
to null
i zwracam 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);
});
};
Jeśli jednak _id
nie odpowiada temu, czego oczekuje Mongoose jako „format” (przypuszczam), na przykład z GET /customers/foo
dziwnym błędem jest zwracany:
CastError: Przesyłanie do ObjectId nie powiodło się dla wartości „foo” w ścieżce „_id”.
Więc co to za błąd?
_id
w schemacie Mongoose. W"bla"
przypadku, gdy użyjesz typuString
zamiast domyślnegoObjectId
i nie będziesz musiał dodawać tego sprawdzenia, ponieważ wszystko może zostać rzutowane na łańcuch.ObjectId
z podanego ciągu (zGET
żądania) w celu przekazania go dofindById
metody?ObjectId("000000000000") --> 303030303030303030303030
Użyj istniejących funkcji do sprawdzenia ObjectID.
źródło
'your id here'
przykładu. github.com/mongodb/js-bson/issues/106Czy analizujesz ten ciąg jako
ObjectId
?Tutaj w mojej aplikacji robię:
źródło
mongoose.Types.ObjectId
.fromString
nie jest funkcjąMam ten sam problem, dodaję
_id: String .in schema, a następnie zaczynam pracę
źródło
Musiałem przenieść moje trasy na inne trasy, które przechwytują parametry trasy:
źródło
najlepiej sprawdzić ważność
źródło
W moim przypadku musiałem dodać
_id: Object
do mojego schematu, a potem wszystko działało dobrze.źródło
Możesz również użyć ObjectId.isValid w następujący sposób:
źródło
źródło
Ostatnio miałem do czynienia z czymś podobnym i rozwiązałem to, wychwytując błąd, aby dowiedzieć się, czy jest to błąd Mongoose ObjectId.
źródło
Stan na 19 listopada 2019 r
Możesz używać
isValidObjectId(id)
od wersji mongoose 5.7.12https://mongoosejs.com/docs/api/mongoose.html#mongoose_Mongoose-isValidObjectId
źródło
Poszedłem z adaptacją rozwiązania @gustavohenke, implementując rzutowanie ObjectId w try-catch owiniętym wokół oryginalnego kodu, aby wykorzystać niepowodzenie rzutowania ObjectId jako metody walidacji.
źródło
To jest stare pytanie, ale możesz również użyć pakietu Express-Validator, aby sprawdzić parametry żądania
express-validator wersja 4 (najnowsza):
express-validator wersja 3:
źródło
Zawsze używaj
mongoose.Types.ObjectId('your id')
warunków w zapytaniu, zweryfikuje pole id przed uruchomieniem zapytania, w wyniku czego aplikacja nie ulegnie awarii.źródło
LUB możesz to zrobić
var ObjectId = require('mongoose').Types.ObjectId; var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
jak wspomniano tutaj , metoda znajdowania Mongoose z $ lub warunkiem nie działa poprawnie
źródło
Sposób rozwiązania tego problemu polega na przekształceniu identyfikatora w ciąg
lubię to fantazyjne z backtick:
`${id}`
powinno to rozwiązać problem bez narzutów
źródło
ObjectId składa się z następujących elementów.
Prawidłowym sposobem sprawdzenia, czy objectId jest poprawny, jest użycie metody statycznej z samej klasy ObjectId.
mongoose.Types.ObjectId.isValid (sample_object_id)
źródło
Rzutuj ciąg na ObjectId
źródło
Wykrywanie i naprawianie błędu ObjectID
Natknąłem się na ten problem, próbując usunąć element za pomocą mangusty i otrzymałem ten sam błąd. Po przejrzeniu zwracanego ciągu stwierdziłem, że wewnątrz zwracanego ciągu znajdują się dodatkowe spacje, które spowodowały błąd. Tak więc zastosowałem kilka z podanych tutaj odpowiedzi, aby wykryć błędny identyfikator, a następnie usunąłem dodatkowe spacje z ciągu. Oto kod, który zadziałał, aby ostatecznie rozwiązać problem.
U mnie to zadziałało i zakładam, że jeśli inne elementy zaczną pojawiać się w ciągu zwrotnym, można je usunąć w podobny sposób.
Mam nadzieję, że to pomoże.
źródło
Naprawiłem ten problem zmieniając kolejność tras.
źródło
Miałem z tym problemy i naprawiłem
mongoose.ObjectId(id)
bezTypes
źródło