Estoy creando un programa cliente-servidor simple usando Node y Express. El programa debe poder aceptar una entrada JSON en el lado del cliente, realizar alguna lógica y luego pasar información al lado del servidor.
Actualmente puedo proporcionar información al cliente con éxito, sin embargo, el lado del servidor simplemente devuelve {} al enviar request.body a la consola después de realizar un POST desde el lado del cliente.
cliente.js:
const clientPort = 9300; const serverPort = 9400; var express = require('express'); var http = require('http'); var app = express(); app.use(express.json()); // json callback app.post('/api', function(request, response) { console.log(`api callback`); // log the received json var input = request.body; console.log(`Received JSON: ${JSON.stringify(input)}`); var options = { host: 'localhost', port: serverPort, path: '/', method: 'POST', header: { 'Content-Type': 'application/json' } }; const httpReq = http.request(options, function(response) { response.setEncoding('utf8'); response.on('data', (chunk) => { console.log(`BODY: ${chunk}`); }); response.on('end', () => { console.log('No more data in response.'); }); }); // write word to request httpReq.write(JSON.stringify(input)); httpReq.end(); }); // listen on port 9300 for inputs app.listen(clientPort, 'localhost', () => { console.log(`Client listening on port ${clientPort}...`); });servidor.js:
const serverPort = 9400; var express = require('express'); var app = express(); app.use(express.json()); // expect to receive the JSON input app.post('/', function(request, response) { console.log(`server callback`); console.log(JSON.stringify(request.body)); }); // listen on port 9400 for inputs from client app.listen(serverPort, 'localhost', () => { console.log(`Server listening on port ${serverPort}...`); });Ejemplo de entrada:
curl --header "Content-Type: application/json" \ INT ✘ 11s --request POST \ --data '{"word":"test"}' \ http://localhost:9300/apiSalida de client.js (basada en la entrada anterior):
Client listening on port 9300... api callback Received JSON: {"word":"test"}Finalmente, la salida server.js:
Server listening on port 9400... server callback {}Debe usar el middleware express urlencoded para que pueda interpretar el objeto del cuerpo en su solicitud.
Debajo app.use(express.json()); pon la siguiente linea
app.use(express.urlencoded({ extended: true }));Más información aquí: https://www.geeksforgeeks.org/express-js-express-urlencoded-function/
Todo lo que tenía que hacer era reemplazar el header en var options con headers .
Voy a ir a darme una bofetada en la cara.