node.js - node - no req.body enviado en solicitudes POST
req.body node js (1)
Después de leer muchos hilos similares, no pude ver el motivo de mi problema ...
Estoy intentando aprender cómo crear una API RESTful con node y express 4, bastante simple y básica, pero cuando intento guardar mi documento con una solicitud POST, no se envía req.body a la solicitud y tengo algunos problemas.
Veamos un pequeño fragmento de código:
module.exports = (router, Bear) ->
router.route ''/bears''
.get (req, res) ->
Bear.find (err, bears) -> if err then err else res.json bears
.post (req, res) ->
newBear =
_id: req.body.bearId
nombre: req.body.nombre
bear = new Bear(newBear)
bear.save (err) ->
if err then res.send err
# res.json msg: "#{bear.nombre}, creado"
res.json msg: "created"
Hasta ahora, esta es mi configuración básica de rutas (por ahora). El servidor es:
express = require ''express''
app = express()
morgan = require ''morgan''
bodyParser = require ''body-parser''
mongoose = require ''mongoose''
app.use bodyParser.urlencoded extended: true
app.use bodyParser.json()
app.use morgan ''dev''
require(''./app/config/js/database'')(mongoose)
router = express.Router()
Bear = require ''./app/models/js/bear''
router.get ''/'', (req, res) -> res.json msg: ''It works''
require(''./app/routes/js/bears'')(router, Bear)
app.use ''/api'', router
port = 8080
app.listen(port)
console.log("Corriendo en #{port}")
Y las otras piezas de código no son relevantes aquí (creo), entonces, cuando envío una solicitud usando cartero, o CURL, siempre recibo una respuesta {}
y un mensaje de bloqueo en mi servidor:
home/nano/Dev/bears/node_modules/mongoose/lib/utils.js:413
throw err;
^
Error: Can''t set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:689:11)
at ServerResponse.header (/home/nano/Dev/bears/node_modules/express/lib/response.js:662:10)
at ServerResponse.send (/home/nano/Dev/bears/node_modules/express/lib/response.js:146:12)
at ServerResponse.json (/home/nano/Dev/bears/node_modules/express/lib/response.js:235:15)
at Promise.<anonymous> (/home/nano/Dev/bears/app/routes/js/bears.js:22:20)
at Promise.<anonymous> (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:172:8)
at Promise.emit (events.js:95:17)
at Promise.emit (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
at Promise.reject (/home/nano/Dev/bears/node_modules/mongoose/node_modules/mpromise/lib/promise.js:111:15)
at Promise.error (/home/nano/Dev/bears/node_modules/mongoose/lib/promise.js:95:15)
Realmente no tengo idea de que realmente no tengo idea de qué hacer, tengo toda la tarde y la noche en esto.
Bien, realizo los cambios en el código y ahora el rastreo desapareció pero la solicitud aún está vacía.
module.exports = (router, Bear) ->
router.route ''/bears''
.get (req, res) ->
Bear.find (err, bears) ->
if err then return res.send err
res.json bears
.post (req, res) ->
newBear =
_id: req.body.bearId
nombre: req.body.nombre
bear = new Bear(newBear)
bear.save (err) ->
if err then return res.send err
res.json msg: "created"
El código JS:
(function() {
module.exports = function(router, Bear) {
return router.route(''/bears'').get(function(req, res) {
return Bear.find(function(err, bears) {
if (err) {
return res.send(err);
}
return res.json(bears);
});
}).post(function(req, res) {
var bear, newBear;
newBear = {
_id: req.body.bearId,
nombre: req.body.nombre
};
bear = new Bear(newBear);
return bear.save(function(err) {
if (err) {
return res.send(err);
}
return res.json({
msg: "created"
});
});
});
};
}).call(this);
Estoy enviando la solicitud a través de RESTClient para Firefox, Curl, Postman ... el encabezado del tipo de contenido es Content-Type: application/json; charset=utf-8
Content-Type: application/json; charset=utf-8
Si comentas:
Bear = require ''./app/models/js/bear''
y reemplazar:
require(''./app/routes/js/bears'')(router, Bear)
con:
router.post "/bears", (req, res, next) ->
console.log req.body
res.json req.body
return
verás que viene el cuerpo req.
Como se mencionó en los comentarios, falta una declaración de devolución en su archivo de ruta bears.coffee . Necesita cambiar la línea 12 para que se lea:
if err then return res.send err
Asegúrese de estar enviando sus parámetros en el cuerpo de la solicitud. Para curl debes usar:
curl -X POST -d "bearId=1221&nombre=papa" http://localhost:8080/api/bears
Para Postman, asegúrese de elegir POST del menú desplegable y haga clic en x-www-form-urlencoded y coloque sus parámetros en los campos "Clave" y "Valor", respectivamente.