update node.js mongodb mongoose

node.js - update - Mongoose: CastError: Cast to ObjectId falló para el valor "[object Object]" en la ruta "_id"



mongoose virtual (9)

Soy nuevo en node.js, así que tengo la sensación de que esto será algo tonto que he pasado por alto, pero no he podido encontrar una respuesta que solucione mi problema. Lo que intento hacer es crear una ruta que cree un nuevo objeto hijo, agregarlo a la matriz de elementos secundarios del padre y luego devolver el objeto hijo al solicitante. El problema con el que me estoy encontrando es que si paso el id. De cadena en findById, el nodo se bloquea con

TypeError: Object {} no tiene método ''cast''

Si trato de pasar un ObjectId, obtengo

CastError: Cast to ObjectId falló para el valor "[object Object]" en la ruta "_id"

Aquí hay un bosquejo de mi código:

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); }); });

Si ejecuto este código con la ruta "/ myClass / 51c35e5ced18cb901d000001 / childClass / create", este es el resultado del código:

error: CastError: Cast to ObjectId falló para el valor "[object Object]" en la ruta "_id" {"path": "51c35e5ced18cb901d000001", "instancia": "ObjectID", "validators": [], "setters": [ ], "getters": [], "_ index": null}

Intenté usar findOne y pasar {_id: id}, pero parece ser exactamente lo que findById hace. He probado las diferentes clases para ObjectId que he visto enumeradas en otros sitios. Intenté llamar a ObjectId () como una función en lugar de un constructor y eso devuelve indefinido. En este punto, me estoy quedando sin ideas y no parece que buscar una respuesta sea de ayuda. ¿Alguna idea sobre lo que estoy haciendo mal?

Además, como dije, soy nuevo en el nodo / Mongo / Mongoose / Express, por lo que si hay una forma mejor de lograr mi objetivo, hágamelo saber. Agradezco todos los comentarios.

EDITAR:

Después de la solución de Peter Lyons, busqué en Google otro error con el que me estaba encontrando y encontré findByIdAndUpdate, que funciona como se esperaba y hace exactamente lo que esperaba hacer. Todavía no estoy seguro de por qué findById y findOne me estaban dando tales problemas y tengo curiosidad por saber (tal vez un informe de error debe ser archivado), así que lo dejaré abierto en caso de que alguien más tenga una respuesta.


Estaba teniendo el mismo problema. Apaga mi Node.js estaba desactualizado. Después de actualizar, está funcionando.


Me he enfrentado a este error. Eso fue porque el valor que desea filtrar en el campo _id no está en formato de ID, y uno "si" debería resolver este problema.

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

Para resolver, siempre valide si el valor de los criterios para la búsqueda es un ObjectId válido

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


Para el registro: tuve este error tratando de llenar un subdocumento de una manera incorrecta:

{ [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 es una matriz que contiene un objeto: ¡incorrecto!

Explicación: estaba enviando datos de php a una API node.js de esta manera:

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

Como puede ver, $ history es una matriz que contiene una matriz. Es por eso que mongoose intenta llenar _id (o cualquier otro campo) con una matriz en lugar de Scheme.ObjectId (o cualquier otro tipo de datos). Los siguientes trabajos:

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


Para todas esas personas atascadas con este problema, pero que todavía no podían resolverlo: tropecé con el mismo error y encontré que el campo _id está vacío.

Lo describí here con más detalle. Todavía no he encontrado una solución, excepto cambiar los campos en los campos _id to not-ID, que es un hack sucio para mí. Probablemente voy a presentar un informe de error para la mangosta. ¡Cualquier ayuda sería apreciada!

Editar: actualicé mi hilo. Archivé un boleto y confirmaron el problema _id faltante. Se va a solucionar en la versión 4.xx que tiene un candidato de lanzamiento disponible en este momento. ¡El rc no se recomienda para un uso productivo!


Recibí este error CastError: Cast to ObjectId falló para el valor "[object Object]" en la ruta "_id" después de crear un esquema, luego modificarlo y no poder rastrearlo. Eliminé todos los documentos de la colección y pude agregar 1 objeto pero no un segundo. Terminé borrando la colección en Mongo y funcionó porque Mongoose recreó la colección.


Respuesta corta: use mongoose.Types.ObjectId .

Mongoose (pero no mongo) puede aceptar los Id de los objetos como cadenas y "lanzarlos" adecuadamente para ti, así que solo usa:

MyClass.findById(req.params.id)

Sin embargo, la advertencia es si req.params.id no es un formato válido para una cadena de Id. De mongo, que generará una excepción que debe atrapar.

Entonces, la principal cosa confusa de entender es que mongoose.SchemaTypes tiene cosas que solo se usan al definir los mongoose schemas, y mongoose.Types tiene las cosas que se utilizan al crear los objetos de datos que se desean almacenar en la base de datos u objetos de consulta. Así que mongoose.Types.ObjectId("51bb793aca2ab77a3200000d") funciona, le dará un objeto que puede almacenar en la base de datos o usar en consultas, y arrojará una excepción si se le entrega una cadena de ID no válida.

findOne toma un objeto de consulta y pasa una única instancia de modelo a la devolución de llamada. Y findById es literalmente un contenedor de findOne({_id: id}) ( ver el código fuente aquí ). Solo find toma un objeto de consulta y pasa una matriz de instancias de modelo coincidentes a la devolución de llamada.

Solo vete despacio Es confuso pero puedo garantizarle que se está confundiendo y no está molestando a la mangosta en este momento. Es una biblioteca bastante madura, pero lleva tiempo acostumbrarse a ella.

La otra cosa sospechosa que veo en tu fragmento no es new al crear ChildClass instancia de ChildClass . Más allá de eso, deberás publicar tu código de esquema para que podamos ayudarte a encontrar cualquier CastErrors que quede.


Si tiene este problema y está realizando un populate en algún lugar a lo largo de las líneas, consulte este número de Mongoose .

Actualiza a Mongoose 4.0 y el problema ha sido resuelto.


También encontré este error de mangos CastError: Cast to ObjectId falló para el valor / "583fe2c488cf652d4c6b45d1 /" en la ruta / "_ id /" para el usuario de modelo

Entonces ejecuto el comando npm list para verificar la versión mongodb y mongoose en mi local. Aquí está el informe: ......
......
├── [email protected]
├── [email protected]
.....

Parece que hay un problema en esta versión de mongodb, entonces lo que hice fue desinstalar y tratar de usar una versión diferente como la 2.2.16.

$ npm uninstall mongodb , eliminará el mongodb de su directorio node_modules. Después de eso, instale la versión inferior de mongodb.
$ npm install [email protected]
¡Finalmente, reinicio la aplicación y el CastError se va!


Tuve el mismo problema, simplemente forcé la identificación en una cadena.

Mi esquema:

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

Y luego, al insertar:

retailerID: `${retailer._id}`