web-dev-qa-db-fra.com

Poster une demande via Chai


J'essaie de faire une demande à mon serveur JS de nœud qui accepte l'appel post/put. Les paramètres que j'essaie d'envoyer avec post-appel via chai ne sont pas visibles sur le serveur (req.body.myparam).
J'ai essayé avec la demande de publication ci-dessous, mais je n'ai pas abouti: -

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

et

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

Le code du nœud JS est donné ci-dessous: -

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;
    }       
};

Le code ci-dessus va à myparam est manquant.

Veuillez me faire savoir quelle est la meilleure façon de faire de même.
Merci d'avance.

19
SCJP1.6 PWR

La façon dont vous avez écrit, je suppose que vous avez utilisé le package chai-http. La fonction . Field () ne fonctionne pas dans chai-http. Un autre utilisateur l'a signalé ici et a ouvert un problème sur github .

Voici comment vous auriez pu écrire:

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

Voici le code complet qui réussit transmet les paramètres au serveur:

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;
25
C00bra

J'ai trouvé deux façons de résoudre le problème avec un req.body Vide.

  1. body en tant que données de formulaire

    .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 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',
    

Dans les deux cas, j'utilise .send({foo: 'bar'}) et non .field('foo' , 'bar').

Le problème n'a apparemment rien à voir avec chai-http. C'est le problème de superagent. Et chai-http Utilise superagent sous le capot.

superagent essaie de jouer à Machine Learning et de faire des suppositions pour nous. Voici ce que leurs les documents disent :

Par défaut, l'envoi de chaînes définira Content-Type Sur application/x-www-form-urlencoded

Les formats SuperAgent sont extensibles, mais par défaut, "json" et "form" sont pris en charge. Pour envoyer les données en tant que application/x-www-form-urlencoded, Appelez simplement .type() avec "form", où la valeur par défaut est "json".

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

chai-http Le plus gros défaut est qu'ils n'ont pas documenté correctement leur plugin. Vous devez rechercher des réponses partout sur Internet et non sur la page chai-http GitHub où il doit être.

8
Green