Ao enviar uma solicitação para /customers/41224d776a326fb40f000001
e um documento com _id
41224d776a326fb40f000001
não existe, doc
é null
e estou retornando um 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);
});
};
No entanto, quando _id
não corresponde ao que o Mongoose espera como "formato" (suponho), por exemplo, com GET /customers/foo
um erro estranho é retornado:
CastError: a conversão para ObjectId falhou para o valor "foo" no caminho "_id".
Então, qual é esse erro?
_id
em seu esquema Mongoose. No"bla"
caso, você usaria um tipo de emString
vez do padrãoObjectId
e não precisaria adicionar essa verificação, pois qualquer coisa pode ser convertida em uma string.ObjectId
partir de uma determinada string (daGET
solicitação) para passá-lo para ofindById
método?ObjectId("000000000000") --> 303030303030303030303030
Use funções existentes para verificar ObjectID.
fonte
'your id here'
exemplo. github.com/mongodb/js-bson/issues/106Você está analisando essa string como
ObjectId
?Aqui em meu aplicativo, o que eu faço é:
fonte
mongoose.Types.ObjectId
.fromString
não é uma funçãoEu tenho o mesmo problema, adiciono
_id: String .in schema e então ele começa a funcionar
fonte
Tive que mover minhas rotas em cima de outras rotas que estão pegando os parâmetros de rota:
fonte
melhor é verificar a validade
fonte
No meu caso, tive que adicionar
_id: Object
em meu Schema, e então tudo funcionou bem.fonte
Você também pode usar ObjectId.isValid como o seguinte:
fonte
fonte
Eu me deparei com algo semelhante recentemente e resolvi pegando o erro para descobrir se é um erro do Mongoose ObjectId.
fonte
Em 19 de novembro de 2019
Você pode usar a
isValidObjectId(id)
partir do mongoose versão 5.7.12https://mongoosejs.com/docs/api/mongoose.html#mongoose_Mongoose-isValidObjectId
fonte
Fui com uma adaptação da solução @gustavohenke, implementando cast ObjectId em um try-catch enrolado no código original para alavancar a falha da conversão de ObjectId como um método de validação.
fonte
Esta é uma questão antiga, mas você também pode usar o pacote express-validator para verificar os parâmetros de solicitação
express-validator versão 4 (mais recente):
express-validator versão 3:
fonte
Sempre use
mongoose.Types.ObjectId('your id')
para condições em sua consulta, ele validará o campo id antes de executar sua consulta, como resultado, seu aplicativo não travará.fonte
OU você pode fazer isso
var ObjectId = require('mongoose').Types.ObjectId; var objId = new ObjectId( (param.length < 12) ? "123456789012" : param );
como mencionado aqui, o método de localização do Mongoose com $ ou condição não funciona corretamente
fonte
A maneira de corrigir esse problema é transformar o id em uma string
eu gosto de fantasia com backtick:
`${id}`
isso deve resolver o problema sem sobrecarga
fonte
ObjectId é composto das seguintes coisas.
A maneira correta de validar se o objectId é válido é usando o método estático da própria classe ObjectId.
mongoose.Types.ObjectId.isValid (sample_object_id)
fonte
Cast string para ObjectId
fonte
Detectando e corrigindo o erro ObjectID
Eu tropecei neste problema ao tentar excluir um item usando o mangusto e obtive o mesmo erro. Depois de examinar a string de retorno, descobri que havia alguns espaços extras dentro da string retornada que causaram o erro para mim. Portanto, apliquei algumas das respostas fornecidas aqui para detectar o id incorreto e remover os espaços extras da string. Aqui está o código que funcionou para que eu finalmente resolvesse o problema.
Isso funcionou para mim e suponho que se outros itens começarem a aparecer na string de retorno, eles podem ser removidos de maneira semelhante.
Eu espero que isso ajude.
fonte
Corrigi este problema mudando a ordem das rotas.
fonte
Eu estava tendo problemas com isso e resolvi ficar
mongoose.ObjectId(id)
semTypes
fonte