26

スーパーエージェントの投稿リクエストで content-type を multipart/form-data に送信しようとしています。

var myagent = superagent.agent();

myagent
  .post('http://localhost/endpoint')
  .set('api_key', apikey)
  .set('Content-Type', 'multipart/form-data')
  .send(fields)
  .end(function(error, response){
    if(error) { 
       console.log("Error: " + error);
    }
  });

私が得るエラーは次のとおりです: TypeError: Argument must be a string

私が削除した場合:

.set('Content-Type', 'multipart/form-data')

エラーは発生しませんが、バックエンドはリクエストを content-type: application/json として受信しています

req.files() にアクセスできるように、コンテンツ タイプを強制的に multipart/form-data にするにはどうすればよいですか?

4

4 に答える 4

16

.type('form') 代わりに 試してください .set('Content-Type', 'multipart/form-data')

http://visionmedia.github.io/superagent/#setting-the-content-typeを参照してください

于 2013-03-15T12:25:14.453 に答える
8

送信している変数に何が含まれているかは明確ではありませんfieldsが、問題がどこにあるのかを判断するのに役立つ情報を以下に示します。

まず、実際にマルチパート リクエストを構築しようとしている場合、これはそのための公式ドキュメントです: http://visionmedia.github.com/superagent/#multipart-requests

あなたが得たエラーについては...

その理由は、リクエストの準備プロセス中に、SuperAgent が送信されるデータをチェックして、それが文字列であるかどうかを確認するためです。そうでない場合は、以下に示すように、「Content-Type」の値に基づいてデータをシリアル化しようとします。

exports.serialize = {
  'application/x-www-form-urlencoded': qs.stringify,
  'application/json': JSON.stringify
};

ここで使用されているもの:

// body
if ('HEAD' != method && !req._headerSent) {
  // serialize stuff
  if ('string' != typeof data) {
    var serialize = exports.serialize[req.getHeader('Content-Type')];
    if (serialize) data = serialize(data);
  }

  // content-length
  if (data && !req.getHeader('Content-Length')) {
    this.set('Content-Length', Buffer.byteLength(data));
  }
}

これは、フォーム「Content-Type」を手動で設定するには、次を使用することを意味します

.set('Content-Type', 'application/x-www-form-urlencoded')

また

.type('form')リシャシンが言ったように

他の「Content-Type」はシリアル化されず、変数の値が文字列でない場合は例外 Buffer.byteLength(data)がスローされます。TypeError: Argument must be a stringfields

于 2013-03-26T04:34:51.000 に答える