ポスト/プットコールを受け入れるノード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に行きません。
同じことをするための最良の方法は何か教えてください。
前もって感謝します。
あなたが書いた方法では、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;
空の_req.body
_の問題を解決する2つの方法を見つけました。
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',
_
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ページではなく、インターネット全体で検索する必要があります。