No se puede insertar en MongoDB con Node.js y Mongoose
Pregunta
Tengo el servidor Node.js y con exressjs/mangosta, estoy tratando de insertar algunos documentos integrados en un documento. Aquí está el código:
El código de nodo:
app.post('/addcomment/:id', function(request, response){ var sys = require('util') , mongoose = require('mongoose'); mongoose.connect('mongodb://localhost/test'); Schema = mongoose.Schema; var CommentSchema = new Schema({ descr: String }); var IssuesSchema = new Schema({ name: String, comment: [CommentSchema] }); mongoose.model('tasks', IssuesSchema); var Issues = mongoose.model('tasks'); var taskid = request.params.id; var user = "test"; var comment = request.param('descr'); Issues.findOne({_id: taskid}, function(err,item) { item.comment.push({descr:comment, posteddate: posteddate, user: user}); item.save(); response.writeHead(200,{"Content-Type": "text/plain"}); response.write(JSON.stringify(t)); response.end(); });
});
De una jQuery estoy haciendo una solicitud de publicación con el siguiente código:
$.ajax({ type: 'POST', url: "http://myhost/addcomment/123", async: false, timeout: 5000, cache: false, data: { descr: $('#comment').val() } ,success: function(data){ console.log(data); ,error: function(){console.log("err")} });
Cuando hago la solicitud de publicación en la consola de nodo, hay un error: no se puede llamar el método 'presionar' de indefinido. En el mismo punto en Chrome, la solicitud todavía está "pendiente". Y si comienzo el servidor nuevamente (incluso después de 10 segundos) la solicitud "llegar" y el registro se inserta pero con una nueva sesión y no puedo obtener el nombre de usuario (que era mi idea inicial). ¿Alguien enfrentó este escenario?
¡Gracias! Stefan
Solución
Realmente debe poner el código que contiene la conexión a Mongoose, así como definiciones de esquema fuera de la devolución de llamada para la ruta. Por el momento, volverá a conectar para mangosta y volverá a definir todos los esquemas con cada solicitud de página.
Por lo tanto, el siguiente código debe permanecer fuera de la devolución de llamada de la ruta:
var sys = require('util')
, mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');
Schema = mongoose.Schema;
var CommentSchema = new Schema({
descr: String
});
var IssuesSchema = new Schema({
name: String,
comment: [CommentSchema]
});
mongoose.model('tasks', IssuesSchema);