web-dev-qa-db-ja.com

チャイ経由でリクエストを送信


ポスト/プットコールを受け入れるノードJSサーバーにリクエストを送信しようとしています。 chaiを介してpost callで送信しようとしているパラメーターは、サーバー(req.body.myparam)では表示されません。
以下の投稿リクエストで試してみましたが、結果はありませんでした:-

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

そして

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

Node JSコードは以下のとおりです。

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

上記のコードはmyparamに行きません。

同じことをするための最良の方法は何か教えてください。
前もって感謝します。

19
SCJP1.6 PWR

あなたが書いた方法では、chai-httpパッケージを使用したと仮定します。 。field()関数はchai-httpでは機能しません。別のユーザーが here を指摘し、 github で問題をオープンしました。

ここにあなたが書くことができた方法があります:

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

以下は、正常にパラメータをサーバーに渡す完全なコードです。

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

空の_req.body_の問題を解決する2つの方法を見つけました。

  1. bodyはフォームデータとして

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

どちらの場合も、.send({foo: 'bar'})ではなく.field('foo' , 'bar')を使用します。

この問題は、明らかに_chai-http_とは関係ありません。 superagentの問題です。そして_chai-http_は内部でsuperagentを使用しています。

superagentは、機械学習をプレイし、推測を試みます。ここに彼らの docs say

デフォルトでは、文字列を送信すると_Content-Type_が_application/x-www-form-urlencoded_に設定されます

SuperAgent形式は拡張可能ですが、デフォルトでは「json」と「form」がサポートされています。データを_application/x-www-form-urlencoded_として送信するには、単に「form」で.type()を呼び出します。デフォルトは「json」です。

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

_chai-http_最大の欠点は、プラグインが適切に文書化されなかったことです。答えは、_chai-http_ GitHubページではなく、インターネット全体で検索する必要があります。

8
Green