Soy nuevo en node.js así que yo tengo la sensación de que esto va a ser algo tonta que se me ha pasado por alto, pero no he sido capaz de encontrar una respuesta que solucione mi problema. Lo que estoy tratando de hacer es crear un camino que va a crear un nuevo objeto secundario, agregar a los padres de la matriz de los niños, a continuación, devolver el objeto secundario para el solicitante. El problema que estoy ejecutando en es que si me paso el id de la cadena en findById, el nodo se bloquea con

TypeError: Object {} no tiene ningún método de «reparto»

Si trato de pasar en un ObjectId lugar, tengo

CastError: Mon ObjectId error de valor «[object object]» en el camino «_id»

Aquí un esbozo 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:[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);
  });
});

Si puedo ejecutar este código con la ruta «/miclase/51c35e5ced18cb901d000001/childClass/crear», este es el resultado del código:

de error: CastError: Mon ObjectId error de valor «[object object]» en el camino «_id»
{«path»:»51c35e5ced18cb901d000001″,»instance»:»ObjectID»,»validators»:[],»setters»:[],»getters»:[],»_index»:null}

He intentado usar findOne y pasando {_id:id} en su lugar, pero esto parece ser exactamente lo que findById hace. Yo he probado las diferentes clases de ObjectId que he visto que aparece en otros sitios. He intentado llamar a los ObjectId() como una función en lugar de un constructor y que devuelve undefined. En este punto, me estoy quedando sin ideas y no parece que googlear para una respuesta está ayudando. Alguna idea sobre lo que estoy haciendo mal?

También, como he dicho, soy nuevo en el nodo/Mongo/Mangosta/Express, así que si hay una mejor manera para lograr mi objetivo, por favor hágamelo saber. Agradezco todos los comentarios.

EDICIÓN:

Después de la solución de Peter Lyons, busqué en google otro error que yo estaba corriendo y encontró findByIdAndUpdate, que funciona como se espera y hace exactamente lo que esperaba hacer. Todavía no estoy seguro de por qué findById y findOne se me da esos problemas y tengo la curiosidad de saber (tal vez un informe de error debe ser presentada), así que voy a dejar esto abierto por si alguien tiene una respuesta.

  • Mi conjetura es su llamada de findOne con una sola ObjectId pero findOne espera un regular JS Objeto de clave/valor condiciones.
  • He respondido a esta pregunta here.
InformationsquelleAutor jmblackmer | 2013-06-20

10 Comentarios

  1. 63

    Respuesta corta: uso mangosta.Tipos.ObjectId.

    Mangosta (pero no mongo) puede aceptar Identificadores de objeto como cadenas y «cast» de forma adecuada para usted, por lo que sólo tiene que utilizar:

    MyClass.findById(req.params.id)

    Sin embargo, la salvedad es que si req.params.id no es un formato válido para un mongo cadena de ID, que tendrá que lanzar una excepción que debe coger.

    De modo que el principal confuso cosa a entender es que mongoose.SchemaTypes tiene cosas que sólo se utilice cuando la definición de la mangosta esquemas, y mongoose.Types tiene las cosas que usas a la hora de crear objetos de datos que desea almacenar en la base de datos o de objetos de consulta. Así mongoose.Types.ObjectId("51bb793aca2ab77a3200000d") obras, le dará un objeto puede almacenar en la base de datos o utilizar en las consultas, y se lanzará una excepción si se le da un ID no válido de cadena.

    findOne toma un objeto de consulta y pasa un solo modelo de instancia para la devolución de llamada. Y findById es, literalmente, un contenedor de findOne({_id: id}) (ver código fuente aquí). Sólo find toma un objeto de consulta y pasa una matriz de coincidencia de instancias de modelo para la devolución de llamada.

    Acaba de ir lento. Es confuso, pero te puedo garantizar que usted se confunda y no golpear a errores en la mangosta en este punto. Es bastante madura biblioteca, pero requiere un poco de tiempo para conseguir la caída de ella.

    El otro sospechoso cosa que ver en el fragmento no está utilizando new al crear instancias de ChildClass. Más allá de eso, usted necesita para publicar su código de esquema para que podamos ayudarle a tracto cualquier CastErrors que quedan.

    • Si intento usar «mangosta.Tipos.ObjectId(«51c35e5ced18cb901d000001″);» (colocando directamente en el código), me sigue apareciendo el error «TypeError: Object {} no tiene ningún método ‘elenco'». También traté de crear instancias de un objeto y tiene el mismo error.
    • Actualizar a la última mangosta? Estoy en 3.6.11.
    • Llamada Miclase.encontrar(req.params.id) obras. No findOne y findById funcionan de la misma manera? Parece un poco contra-intuitivo han de encontrar la función que devuelve un único documento cuando los otros dos existen. He modificado el código para obtener el primer elemento de la matriz de ahora, pero está fallando en addToSet() ahora con «TypeError: Object {} no tiene ningún método ‘elenco'».
    • También estoy en 3.6.11. Solo he puesto todo esto la otra noche, por lo que espero que todo lo que ya está hasta la fecha.
    • No funciona como la de 3 de julio de 2014!! Por qué new mongoose.Schema.ObjectId("51bb793aca2ab77a3200000d") funciona bien, pero new mongoose.Schema.ObjectId(request.params[0]) lanza un error?? Cual me coloque una cadena de "51bb793aca2ab77a3200000d" en una dirección url /51bb793aca2ab77a3200000d. Y cuando se obtienen a partir de una url se produce un error.
    • Usted está usando mal la función de constructor. Uso mongoose.Types.ObjectId. mongoose.Schema.ObjectId es para la definición de esquemas sólo.
    • Gracias, me señaló la dirección correcta.

  2. 25

    He enfrentado a este error, eso fue debido a Que el valor que desea filtrar en el campo _id no está en un formato de ID, un «si» debe resolver su error.

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

    Para resolverlo, siempre validar si el valor de los criterios para la búsqueda es válido ObjectId

    const criteria = {};
    criteria.$or = [];
    
    if(params.q) {
      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
    })
    • Correcto. Yo era una prueba de un extremo a GET usuario con un findById, resulta que el id param debe ser de 12 bits, de lo contrario la mangosta se producirá a emitir. Yo estaba usando aleatoria de números cortos.
  3. 3

    Para todas aquellas personas atascado con este problema, pero todavía no podía resolverlo: me topé con el mismo error y se encontró el _id campo está vacío.

    Me lo describió aquí en más detalle. Todavía no han encontrado una solución, excepto el cambio de los campos en _id no-campos de ID que es un sucio truco para mí. Yo soy probablemente va a presentar un informe de error para la mangosta. Cualquier ayuda se agradece!

    Edit: he actualizado mi hilo. He presentado un billete y se confirmó la falta _id problema. Va a ser fija en el 4.x.x versión que tiene una release candidate disponible en este momento. La rc no está recomendado para uso productivo!

    • interesante, creo que tengo el mismo problema, mi _id no estaba definida y por lo tanto no podía ser de fundición de ObjectId
  4. 2

    Tenido el mismo problema, acabo de forzó el id en una cadena.

    Mi esquema:

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

    Y luego, a la hora de insertar:

    retailerID: `${retailer._id}`
  5. 1

    Que estaba recibiendo este error CastError: Mon ObjectId error de valor «[object object]» en el camino «_id» después de la creación de un esquema, a continuación, modificar y no pudo localizarlo. He eliminado todos los documentos de la colección y yo podría agregar 1 objeto pero no para un segundo. Terminé borrar la colección en Mongo y que trabajó como Mangosta recreado la colección.

  6. 1

    Para el registro: he tenido este error tratando de llenar un subdocumento en un camino equivocado:

    {
    [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 ^ valor es una matriz que contiene un objeto: mal!

    Explicación: yo estaba envío de datos desde php a una node.js la API 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 se puede ver $la historia es una matriz que contiene una matriz. Es por eso que la mangosta de intentar llenar _id (o cualquier otro campo) con una matriz en lugar de un Esquema.ObjectId (o cualquier otro tipo de datos). Las siguientes obras:

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

    Yo estaba teniendo el mismo problema.Resulta que mis Node.js era obsoleta. Después de la actualización es de trabajo.

  8. 0

    También me encontré con esta mangosta error CastError: Mon ObjectId fallado por valor de \»583fe2c488cf652d4c6b45d1\» en el camino
    \»_id\» para el modelo de Usuario

    Así que me quede mecanismo nacional de prevención de la lista de comandos para comprobar la mongodb y mangosta versión en mi local.
    Acá te dejo el informe:
    ……

    ……

    ├── [email protected]

    ├── [email protected]

    …..

    Parece que hay un problema en este mongodb versión, así que lo que hice fue desinstalar y trata de usar diferentes versión tal y como 2.2.16

    $ npm uninstall mongodb, se elimina la mongodb desde su directorio node_modules. Después de instalar la versión inferior de mongodb.

    $ npm install [email protected]

    Por último, me reinicie la aplicación y el CastError se ha ido!!

  9. 0

    acaba de cambiar el camino que va a trabajar por ejemplo

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

    cambio

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

    Acabo de añadir –es– a la ruta de acceso (miclase) para convertirse en (myClasses)

    ahora debe trabajar y no ver que el error

Dejar respuesta

Please enter your comment!
Please enter your name here