Publicar solicitud a través de Chai

Estoy intentando realizar una solicitud a mi servidor JS de nodo que acepta la llamada post / put. Los parámetros que estoy intentando enviar con la llamada posterior a través de chai no están visibles en el servidor (req.body.myparam).
He intentado con la siguiente solicitud de publicación, pero terminó con no resultados: –

var host = "http://localhost:3000"; var path = "/myPath"; chai.request(host).post(path).field('myparam' , 'test').end(function(error, response, body) { 

y

 chai.request(host).post(path).send({'myparam' : 'test'}).end(function(error, response, body) { 

El código del nodo JS se da a continuación:

 app.put ('/mypath', function(req, res){ //Handling post request to create league createDoc (req, res); }) app.post ('/mypath', function(req, res){ //Handling post request to create league createDoc (req, res); }) var createDoc = function (req, res) { var myparam = req.body.myparam; //league id to create new league if (!myparam) { res.status(400).json({error : 'myparam is missing'}); return; } }; 

El código de arriba va al myparam que falta.

Por favor, hágame saber cuál es la mejor manera de hacer lo mismo.
Gracias por adelantado.

Por la forma en que escribiste, asumo que usaste el paquete chai-http . La función .field () no funciona en chai-http . Otro usuario lo señaló aquí y abrió un problema en github .

Así es como podrías haber escrito:

 .set('content-type', 'application/x-www-form-urlencoded') .send({myparam: 'test'}) 

Aquí está el código completo que pasa los parámetros al servidor con éxito :

test.js

 'use strict'; var chai = require('chai'); var chaiHttp = require('chai-http'); chai.use(chaiHttp); describe('Test group', function() { var host = "http://" + process.env.IP + ':' + process.env.PORT; var path = "/myPath"; it('should send parameters to : /path POST', function(done) { chai .request(host) .post(path) // .field('myparam' , 'test') .set('content-type', 'application/x-www-form-urlencoded') .send({myparam: 'test'}) .end(function(error, response, body) { if (error) { done(error); } else { done(); } }); }); }); 

server.js

 'use strict'; var bodyParser = require("body-parser"), express = require("express"), app = express(); app.use(bodyParser.urlencoded({extended: true})); app.put ('/mypath', function(req, res){ //Handling post request to create league createDoc (req, res); }); app.post ('/mypath', function(req, res){ //Handling post request to create league createDoc (req, res); }); var createDoc = function (req, res) { console.log(req.body); var myparam = req.body.myparam; //league id to create new league if (!myparam) { res.status(400).json({error : 'myparam is missing'}); return; } }; app.listen(process.env.PORT, process.env.IP, function(){ console.log("SERVER IS RUNNING"); }); module.exports = app; 

Encontré dos maneras de resolver el problema con el req.body vacío.

  1. body como datos de formulario

     .put('/path/endpoint') .type('form') .send({foo: 'bar'}) // .field('foo' , 'bar') .end(function(err, res) {} // headers received, set by the plugin apparently 'accept-encoding': 'gzip, deflate', 'user-agent': 'node-superagent/2.3.0', 'content-type': 'application/x-www-form-urlencoded', 'content-length': '127', 
  2. body como application/json

     .put('/path/endpoint') .set('content-type', 'application/json') .send({foo: 'bar'}) // .field('foo' , 'bar') .end(function(err, res) {} // headers received, set by the plugin apparently 'accept-encoding': 'gzip, deflate', 'user-agent': 'node-superagent/2.3.0', 'content-type': 'application/json', 'content-length': '105', 

En ambos casos, uso .send({foo: 'bar'}) y no .field('foo' , 'bar') .

El problema aparentemente no tiene nada que ver con chai-http . Es asunto del superagent . Y chai-http usa superagent bajo el capó.

superagent intenta jugar Machine Learning y hacer conjeturas por nosotros. Esto es lo que dicen sus documentos :

Por defecto, las cadenas de envío establecerán Content-Type en application/x-www-form-urlencoded

Los formatos SuperAgent son extensibles, sin embargo, de forma predeterminada, se admiten “json” y “form”. Para enviar los datos como application/x-www-form-urlencoded simplemente invoque application/x-www-form-urlencoded .type() con “form”, donde el valor predeterminado es “json”.

  request.post('/user') .type('form') .send({ name: 'tj' }) .send({ pet: 'tobi' }) .end(callback) 

chai-http mayor fallo de chai-http es que no documentaron su complemento correctamente. Debe buscar las respuestas en Internet y no en la página de GitHub de chai-http donde debe estar.