virtuals node.js mongodb mongoose express

node.js - mongoose virtuals



Node.js+mongoose (4)

Soy nuevo en Node.js y estoy enfrentando un error:

RangeError: se excedió el tamaño máximo de pila de llamadas

No puedo resolver el problema porque la mayoría de los problemas de apilamiento en otras preguntas de stackoverflow sobre Node.js tienen que ver con cientos de devoluciones de llamada, pero solo tengo 3 aquí.

Primero una búsqueda ( findById ) luego una actualización y luego una operación de guardar.

Mi código es:

app.post(''/poker/tables/:id/join'', function(req, res) { var id = req.params.id; models.Table.findById(id, function(err, table) { if (err) { console.log(err); res.send({ message: ''error'' }); return; } if (table.players.length >= table.maxPlayers) { res.send({ message: "error: Can''t join ! the Table is full" }); return; } console.log(''Table isnt Full''); var BuyIn = table.minBuyIn; if (req.user.money < table.maxPlayers) { res.send({ message: "error: Can''t join ! Tou have not enough money" }); return; } console.log(''User has enought money''); models.User.update({ _id: req.user._id }, { $inc: { money: -BuyIn } }, function(err, numAffected) { if (err) { console.log(err); res.send({ message: ''error: Cant update your account'' }); return; } console.log(''User money updated''); table.players.push({ userId: req.user._id, username: req.user.username, chips: BuyIn, cards: {} }); table.save(function(err) { if (err) { console.log(err); res.send({ message: ''error'' }); return; } console.log(''Table Successfully saved with new player!''); res.send({ message: ''success'', table: table }); }); }); }); });

¡El error ocurre durante la operación de guardado al final!

Uso MongoDb con mongoose, por lo que Table y User son mis colecciones de bases de datos.

Esto es de mi primer proyecto con Node.js, Express.js y MongoDB, así que probablemente he cometido grandes errores en el código asíncrono :(

EDITAR : he intentado reemplazar el guardar con una actualización:

models.Table.update({ _id: table._id }, { ''$push'': { players: { userId: req.user._id, username: req.user.username, chips: BuyIn, cards: {} } } }, function(err, numAffected) { if (err) { console.log(err); res.send({ message: ''error'' }); return; } console.log(''Table Successfully saved with new player!''); res.send({ message: ''success'', table: table }); });

Pero no ayuda, el error sigue llegando y no sé cómo depurarlo: /


Causas MyModel.collection.insert :

[RangeError: se excedió el tamaño máximo de pila de llamadas]

Cuando se pasa una matriz de instancias de MyModel lugar de solo una matriz con los valores de esos objetos.

RangeError:

let myArray = []; myArray.push( new MyModel({ prop1: true, prop2: false }) ); MyModel.collection.insert(myArray, callback);

No hay error:

let myArray = []; myArray.push( { prop1: true, prop2: false } ); MyModel.collection.insert(myArray, callback);


Hay algunas formas de depurar aplicaciones nodejs

Depurador incorporado

El depurador Node.js se documenta aquí: http://nodejs.org/api/debugger.html

Para colocar puntos de interrupción, simplemente coloque el debugger; en el lugar que quieras romper. Como usted dijo, la table.save llamada de table.save está dando problemas, podría poner un punto de interrupción dentro de esa función.

Luego ejecuta el nodo con el depurador habilitado:

node debug myscript.js

Y obtendrá una salida más útil.

Investigando la pila

También puede usar console.trace para imprimir un seguimiento de pila, si tiene una buena idea de cuándo / dónde se encuentra con problemas, y desea averiguar cómo llegó allí.

Buena suerte, espero que esto ayude!


Seguí recibiendo este error y finalmente lo resolví. Es muy difícil de depurar ya que no se presenta información real en el error.

Resulta que estaba tratando de guardar un objeto en un campo. Guardar solo una propiedad específica del objeto, o JSON que lo estratificó, funcionó como un encanto.

Parece que sería bueno que el controlador diera un error más específico, pero bueno.


También he estado pasando por este problema. Básicamente, cuando tiene una propiedad con una ref y desea usarla en una búsqueda, por ejemplo, no puede pasar todo el documento.

Por ejemplo:

Model.find().where( "property", OtherModelInstance );

Esto provocará ese error.

Sin embargo, tienes 2 formas de arreglar esto por ahora:

Model.find().where( "property", OtherModelInstance._id ); // or Model.find().where( "property", OtherModelInstance.toObject() );

Esto puede detener sus problemas por ahora.

Hay un problema en su repositorio de GitHub en el que informé esto, sin embargo, por ahora no tiene solución. Vea el tema aquí .