Pytanie Wyślij prośbę przez Chai



Próbuję wykonać żądanie do mojego serwera JS węzła, który akceptuje wywołanie post / put. Parametry, które próbuję wysłać pocztą przez chai, nie są widoczne na serwerze (req.body.myparam).
Próbowałem z poniższą prośbą, ale zakończyłem z brakiem wyników: -

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

i

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

Kod Jode węzła podano poniżej: -

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

Powyższy kod nie trafia do myparam.

Proszę dać mi znać, jaki jest najlepszy sposób, aby zrobić to samo.
Z góry dziękuję.


14
2018-02-29 10:54


pochodzenie


Czy możesz udostępnić kod punktu końcowego? - Mukesh Sharma
Zaktualizowano kod. Daj mi znać, jeśli potrzebujesz czegoś jeszcze. - SCJP1.6 PWR
Nie widzę league zdefiniowane gdziekolwiek? - Derek
Mój błąd. Nie skopiowałem poprawnie kodu. Zaktualizowano powyższy kod. Proszę sprawdzić. Dzięki - SCJP1.6 PWR


Odpowiedzi:


W sposób, w jaki napisałeś, zakładam, że użyłeś chai-http pakiet. The .pole() funkcja nie działa chai-http. Inny użytkownik wskazał to tutaj i otworzył problem na github.

Oto, jak mogłeś napisać:

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

Oto pełny kod, który z powodzeniem przekazuje parametry do serwera:

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;

19
2018-05-16 09:16



To działało dla mnie. To zabawne, ponieważ docs twierdzą, że używają metody .field () podczas publikowania danych formularzy, ale może to nie działa, jeśli używasz bodyCarser w ten sposób na serwerze? - Gabriel Kunkel
jak załączyć plik w tym? Wiem, że to jest kod .attach ('imageField', fs.readFileSync ('avatar.png'), 'avatar.png') Ale nie jestem pewien, gdzie go dołączyć - Kannan
Co Ty module.exports = app; bo jeśli nie potrzebujesz tego w swoich testach? Po wyeksportowaniu możesz go wymagać, a następnie chai.request(server).post(path). To ci pozwoli mock lub spy, np. za pomocą npmjs.com/package/sinon-chai - Alexander


Znalazłem dwa sposoby rozwiązania problemu z pustymi req.body.

  1. body jako dane formularza

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

W obu przypadkach używam .send({foo: 'bar'}) i nie .field('foo' , 'bar').

Problem najwyraźniej nie ma nic wspólnego chai-http. To jest superagentproblem. I chai-http jest używane superagent pod maską.

superagent próbuje grać w Machine Learning i zgadywać nas. Oto, co ich docs mówią:

Domyślnie wysyłanie łańcuchów ustawi Content-Type do application/x-www-form-urlencoded

Formaty SuperAgent są rozszerzalne, ale domyślnie obsługiwane są "json" i "formularz". Aby wysłać dane jako application/x-www-form-urlencoded po prostu wywołaj .type() z "formą", gdzie domyślnie jest "json".

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

chai-http Największą wadą jest to, że nie udokumentowali poprawnie swojej wtyczki. Musisz szukać odpowiedzi w całym Internecie, a nie na chai-http Strona GitHub, gdzie musi być.


4
2018-06-21 03:31



jak załączyć plik w tym? Wiem, że to jest kod .attach ('imageField', fs.readFileSync ('avatar.png'), 'avatar.png') Ale nie jestem pewien, gdzie go dołączyć - Kannan
Ta dokumentacja może ci bardzo pomóc github.com/chaijs/chai-http - Faris Rayhan