Soy un poco nuevo en todo esto (incluidas las devoluciones de llamada de Javascript y ES6). Estoy usando NodeJS + Express + MongoDB.
Estoy llamando a una función Ajax para actualizar un elemento y la llamada exitosa de Ajax nunca se realiza.
Aquí está mi llamada Ajax (llamada desde React)
editBug : function(bug){ console.log('about to edit bug with these values',bug); $.ajax({ url:'/api/bugs', method: 'PUT', data:bug }) .done((jqxhr) => { console.log('succcess while editing the bug'); this.setState({successVisible : true}); }) .fail((jqxhr) => { console.log('error : ' + jqxhr); }) },Aquí está mi función API:
app.put('/api/bugs',function(req,res){ //console.log('req',req); console.log('query string : ',req.query); console.log('query params : ',req.params); console.log('query body: ',req.body); let id = new ObjectID(req.body._id); req.body._id = new ObjectID(req.body._id); db.collection('bugs').replaceOne( {_id:id}, req.body, function(err,result){ assert.equal(err,null); console.log('Successfull replace!'); res.status(200); } ); }); ¡El Successfull replace! log se muestra correctamente en el lado del servidor. El about to edit bug with these values se muestra correctamente en la parte frontal. Pero el succcess while editing the bug no se muestra en la interfaz y parece que la llamada .done nunca se ejecuta.
¿No necesita terminar su objeto de respuesta en el lado de Node.js? Intente agregar res.end(); o cualquier tipo de respuesta a su objeto de respuesta.
Además, puede usar la pestaña de red de Chrome (o cualquier otro navegador) para ver realmente cómo terminan sus solicitudes AJAX, para ver si se bloquean o finalizan.
El problema es que no está enviando ninguna respuesta al navegador del lado del nodo. Pruebe el siguiente fragmento y debería estar listo para comenzar
Además, me gustaría señalar que debe manejar los errores. Al actualizar los bugs si algo sale mal, la mejor práctica sería informar al navegador con el código de estado 500 que indica que la acción prevista falló. He agregado este aspecto en el recorte a continuación.
app.put('/api/bugs', function(req, res) { //console.log('req',req); console.log('query string : ', req.query); console.log('query params : ', req.params); console.log('query body: ', req.body); let id = new ObjectID(req.body._id); req.body._id = new ObjectID(req.body._id); db.collection('bugs').replaceOne({ _id: id }, req.body, function(err, result) { if (err) { console.log('Failed replace'); res.status(500).end(); // <- We set the response status code and end the request } else { assert.equal(err, null); console.log('Successfull replace!'); res.status(200).end(); // <- We set the response status code and end the request } } ); });