He revisado bastantes otras publicaciones y estoy muy perdido con esto.
Puedo ejecutar un console.log(req) y obtener el siguiente resultado
ServerResponse { ... req: IncomingMessage { ... url: '/my-endpoint', method: 'POST', statusCode: null, statusMessage: null, ... body: { foo: 'bar' }, _body: true, ... route: Route { path: '/my-endpoint', stack: [Object], methods: [Object] } }, ... Parece sólido, por lo que esperaría hacer console.log(req.body) y obtener { foo: 'bar' } de nuevo en la consola... pero no, quedando indefinido
Después de investigar, descubrí que puede ser algo con mi archivo app.js y específicamente con un body-parser , sin embargo, ya tengo todo eso.
var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); var http = require('http'); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'pug'); app.use(logger('dev')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); //Home Page Rendering var index = require('./routes/index'); app.use('/', index); // All other routes are kept in the `routes` module require('./routes')(app); module.exports = app; routes.js
module.exports = function routing(app) { var apiClient = require('./services/apiClient'); app.post('/get-device-info', function(err, req, res){ console.log("/get-device-info routes"); apiClient(req, res); }); }; apiClient.js
module.exports = function callApi(req, res){ console.log(req); console.log(req.body) }; index.js
var express = require('express'); var router = express.Router(); /* GET home page. */ router.get('/', function(req, res, next) { res.render('index', { title: 'Express' }); }); module.exports = router;Esto es lo que he probado
app.use(express.bodyParser());
Asegurarse de que la solicitud entrante declare explícitamente application/json
Declarar body parser.json de otras maneras
Agregar una función de configuración
Su problema es que Express no usa las primeras devoluciones de llamada de error para sus controladores de ruta. El siguiente código no funcionará porque el controlador app.post no tiene la firma (req, res) => {} . En el siguiente código, err es igual a req , req es igual a res y res es igual a next .
// routes.js module.exports = function routing(app) { var apiClient = require('./services/apiClient'); app.post('/get-device-info', function(err, req, res){ console.log("/get-device-info routes"); // Assuming the request is correct // the value of body will be the request body console.log(res.body) apiClient(req, res); }); };`Hay 3 firmas de devolución de llamada de ruta diferentes que puede usar en Express
(req, res) => {} - Este es el más básico y define una ruta que solo se preocupa por la solicitud y la respuesta.(req, res, next) => {} - Esta es una firma de devolución de llamada de middleware que parece una devolución de llamada de ruta básica, pero también asigna el next objeto que le dice a Express que llame a la siguiente ruta coincidente.(err, req, res, next) => {} : esta es la devolución de llamada de ruta de manejo de errores y solo necesita 1 por Express Router Middleware o Express App. Se llama si se llama a next(err) dentro de una ruta o un middleware. Más específicamente, si next() no se llama con una cadena o nada, omitirá todo el Middleware y las rutas restantes e irá directamente al controlador de errores. Puede leer más sobre esto en Express DocsDeberá cambiar la definición de la ruta a
app.post('/get-device-info', (req, res) => { apiClient(req, res) })O incluso podrías hacer esto
module.exports = app => { let apiClient = require('./services/apiClient') app.post('/get-device-info', apiClient) }Prueba esto, ya que funcionó para mí.
Primero declare app y luego bodyParser , ya que bodyParser se usa dentro de app :
const app = express(); const bodyParser = require('body-parser');Entonces tenga estas líneas a continuación:
app.use(bodyParser.json()) app.use(bodyParser.urlencoded({extended: true}))