I am trying to make a request to my node JS server which accepts post/put call. The parameters I am trying to send with post call via chai is not visible on server (req.body.myparam).
I have tried with below post request but ended with not results:-
var host = "http://localhost:3000";
var path = "/myPath";
chai.request(host).post(path).field('myparam' , 'test').end(function(error, response, body) {
and
chai.request(host).post(path).send({'myparam' : 'test'}).end(function(error, response, body) {
Node JS code is given below:-
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;
}
};
Above code goes to myparam is missing.
Please let me know what is the best way to do the same.
Thanks in Advance.
The way you have written, I assume that you used chai-http package. The .field() function does not work in chai-http. Another user pointed it out here and opened an issue on github.
Here is how you could have written:
.set('content-type', 'application/x-www-form-urlencoded')
.send({myparam: 'test'})
Here is the full code that successfully passes parameters to the server:
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;
I found two ways to solve the issue with empty req.body
.
body
as a form data
.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',
body
as 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',
In both cases I use .send({foo: 'bar'})
and not .field('foo' , 'bar')
.
The issue apparently has nothing to do with chai-http
. It is superagent
's issue. And chai-http
is using superagent
under the hood.
superagent
tries to play Machine Learning and make guesses for us. Here is what their docs say:
By default sending strings will set the Content-Type
to application/x-www-form-urlencoded
SuperAgent formats are extensible, however by default "json" and "form" are supported. To send the data as application/x-www-form-urlencoded
simply invoke .type()
with "form", where the default is "json".
request.post('/user')
.type('form')
.send({ name: 'tj' })
.send({ pet: 'tobi' })
.end(callback)
chai-http
biggest fault is that they didn't document their plugin properly. You have to search for answers all over the Internet and not on chai-http
GitHub page where it must be.