2016-02-29 16 views
9


Próbuję wykonać żądanie do mojego serwera JS węzła, który akceptuje wywołanie typu "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żej żądanie POST, ale skończyło się nie wyników: -
Wysłanie żądania przez Chai

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

Węzeł JS 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 idzie do myparam brakuje.

Proszę dać mi znać, jaki jest najlepszy sposób, aby zrobić to samo.
Dzięki z góry.

+0

Czy możesz udostępnić kod punktu końcowego? –

+0

Zaktualizowano kod. Daj mi znać, jeśli potrzebujesz czegoś jeszcze. –

+0

Nie widzę nigdzie zdefiniowanej "ligi"? – Derek

Odpowiedz

13

Sposób, w jaki napisałeś, zakładam, że użyłeś pakietu chai-http. Funkcja .field() nie działa w przypadku chai-http. Inny użytkownik wskazał to na here i otworzył problem na github.

Oto jak można napisać:

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

Oto pełny kod, który powodzeniem przekazuje parametry na serwer:

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

serwer.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; 
+0

To zadział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? –

+0

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

3

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

  1. body jako danych formularzy

    .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 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 z chai-http. Jest to numer superagent. I chai-http używa pod maską superagent.

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

Domyślnie wysyłanie ciągów ustawi Content-Type do application/x-www-form-urlencoded

formaty SuperAgent są rozciągliwe, jednak domyślnie „json” i „forma” są obsługiwane. Aby wysłać dane jako application/x-www-form-urlencoded, wystarczy wywołać .type() z "formularzem", gdzie domyślnie jest "json".

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

chai-http największą winą jest to, że nie dokumentują swoje wtyczki prawidłowo. Musisz szukać odpowiedzi w całym Internecie, a nie na stronie GitHub, gdzie musi być.

+0

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

Powiązane problemy