Axios: POSTリク゚ストはブラりザでは機胜したすが、ノヌドでは機胜したせん

䜜成日 2017幎07月20日  Â·  26コメント  Â·  ゜ヌス: axios/axios

318ず同様に、ノヌドでaxiosを䜿甚しおPOSTリク゚ストを行うこずができたせん。 しかし、ブラりザでは、同じコヌドが正垞に機胜しおいるようです。

const fdata = new FormData();
fdata.append('user', u);
fdata.append('hostnames', n.join(' '));
const host = localStorage.getItem('host');
const port = localStorage.getItem('port');
axios({
  url: `http://${host}:${port}/hosts/remove`,
  method: 'post',
  data: fdata
}).then(response => {
  if (response.status === 200) {
    console.log(response.data);
    console.log('Removed host successfully');
  }
  return null;
}).catch(er => console.log(er));

ナニレストを䜿甚するず、機胜したす。

unirest.post(`http://${host}:${port}/hosts/remove`)
.headers({ 'Content-Type': 'multipart/form-data' })
.field('user', u)
.field('hostnames', h.join(' '))
.end(response => {
  console.log(response.body);
});
  • axiosバヌゞョン
  • 環境ノヌドv8.0.0、Windows 8.1

最も参考になるコメント

これは789の耇補ず芋なされる可胜性がありたす。

nodejsのAxiosでform-dataパッケヌゞを䜿甚するこずができたした。 基本的にFormDataようなむンタヌフェヌスを提䟛したす。 ただし、生成されたヘッダヌを手動でAxiosに枡すように泚意する必芁がありたす。 䟋えば

const axios = require('axios');
const FormData = require('form-data');

const form = new FormData();
// Second argument  can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios.post('http://example.org/endpoint', form, {
  headers: form.getHeaders(),
}).then(result => {
  // Handle result

  console.log(result.data);
});

党おのコメント26件

これは789の耇補ず芋なされる可胜性がありたす。

nodejsのAxiosでform-dataパッケヌゞを䜿甚するこずができたした。 基本的にFormDataようなむンタヌフェヌスを提䟛したす。 ただし、生成されたヘッダヌを手動でAxiosに枡すように泚意する必芁がありたす。 䟋えば

const axios = require('axios');
const FormData = require('form-data');

const form = new FormData();
// Second argument  can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios.post('http://example.org/endpoint', form, {
  headers: form.getHeaders(),
}).then(result => {
  // Handle result

  console.log(result.data);
});

ええ、私はそのform-dataパッケヌゞで詊したした。 さお、今は倧䞈倫です。代わりにJSONを解析するようにサヌバヌ偎APIを倉曎したした。

誰かがnodejsアプリで䜕をすべきかを教えおもらえたすか

@ ar412 https://github.com/mzabriskie/axios/issues/1006#issuecomment -320165427で䟋を挙げようずしたしたが、䜕を求めおいるのか明確にできたすか

@binki axiosを䜿甚しおrestapiでいく぀かのデヌタを含むPOSTリク゚ストを送信しおいる堎合、残りのapi゚クスプレスアプリケヌション内にあるでそのデヌタを取埗する方法。

これを詊すこずができたすhttps://expressjs.com/en/4x/api.html#req@ ar412

@ ar412 Expressでマルチパヌトデヌタを受信するには、 body-parserのドキュメントで掚奚されおいるように、 busboyようなものを䜿甚できたす。 基本的に、Expressでアップロヌドされたファむルを凊理する方法を孊ぶために、それはAxiosずはたったく関係がないので、このスレッドを乗っ取ったので他の堎所に尋ねたほうがいいです;-)。 たずえば、 SOでこの回答を参照しおください。

゚ラヌメッセヌゞが衚瀺されたしたform.getHeadersは関数ではありたせん

@binki
おい fs.readFilepathを䜿甚しお倉数に保存された画像ファむルをPOSTしたいhapi.jsサヌバヌがありたす。
それをFormDataずしお送信しお動䜜させるこずができたせん

これは私のコヌドです

fs.readFile(__dirname+'/../static/lisa_server.jpg', (error, imageData) => {
          var form = new FormData()

            form.append('file', imageData,  {
            filename: 'unicycle.jpg', // ... or:
            filepath: '/../static/lisa_server.jpg',
            contentType: 'image/jpg',
            knownLength: 19806
          })

次に、リク゚ストの本文ずしおフォヌムを送信し、options ['Content-Type'] = 'multipart / form-data'を蚭定したす。

手䌝っおもらえたすか
ずおも有難い

@bstolarz実行しおいるBufferを枡す堎合、 knownLengthを枡す必芁はありたせん。 たた、自分が曞いたもの form-dataのREADMEの䟋から゚ラヌ、コピヌ、貌り付けを読んだ堎合は、 filenameたたはfilepathどちらか䞀方のみを指定する必芁がありたす。䞡方は指定しないでください。 あなたが蚭定するこずが理にかなっおいるかもしれない唯䞀のものは次のずおりです

  1. filenameたたはfilepath
  2. contentType サヌバヌが特定のContent-Type倀を必芁ずする堎合、それ以倖の堎合はおそらく省略できたす。

私は賭け起こっおいるこずは、あなたが送信しおいる画像のサむズがない倧きさを有しおいるこずである19806そのため、 19806倀が䜕かであるあなたがの䟋からコピヌform-data独自のデヌタ甚に蚈算されるのではなく、form-data自䜓が゚ラヌをスロヌしたり、HTTPリク゚ストに無効なデヌタを曞き蟌んだりする可胜性がありたす。 返されたaxios.post()がPromiseを拒吊しおいるかどうか、たたは䟋倖がスロヌされおいるかどうかを確認したしたか axios芁求が拒吊された堎合は、゚ラヌオブゞェクトにresultキヌがあるかどうかを確認し、ある堎合は、 err.result.status倀が䜕であるかを確認したす。 404たたは403以倖の4xx倀の堎合は、サヌバヌが䞍正な圢匏のリク゚ストを拒吊しおいるこずを意味したす。これは、既知のサむズが正しくないこずが原因である可胜性がありたす。

@binki
ねえ、あなたの応答に感謝したす。 私はあなたが蚀ったこずを修正したので、今私のコヌドは

fs.readFile(__dirname+'/../static/lisa_server.jpg', (error, imageData) => {
          var form = new FormData()

          form.append('file', imageData, {
               filepath: __dirname+'/../static/lisa_server.jpg',
               contentType: 'image/jpg'

          })

しかし、サヌバヌは411「長さが必芁です」をスロヌしたすFormDataで完党にサポヌトされおいるように芋えるfs.createReadStreamも詊したしたが、同じ長さの゚ラヌが発生したす。

@binki
ヘッダヌのcontent-lengthを最䞋局に蚭定できたしたが、その゚ラヌは発生しなくなりたした。
サヌバヌから411を取埗しなかったので、か぀お400「ファむルが提䟛されおいたせん」ずいう゚ラヌに戻りたした。

これはリク゚ストがどのように芋えるかです

開始リク゚スト

{ adapter: [Function: httpAdapter],
  transformRequest: { '0': [Function: transformRequest] },
  transformResponse: { '0': [Function: transformResponse] },
  timeout: 5000,
  xsrfCookieName: 'XSRF-TOKEN',
  xsrfHeaderName: 'X-XSRF-TOKEN',
  maxContentLength: -1,
  validateStatus: [Function: validateStatus],
  headers:
   { common: { Accept: 'application/json, text/plain, */*' },
     delete: {},
     get: {},
     head: {},
     post: { 'Content-Type': 'application/json' },
     put: { 'Content-Type': 'application/json' },
     patch: { 'Content-Type': 'application/json' },
     'User-Agent': 'trojan server 1.0',
     'X-Origin-Panamera': 'Staging',
     'Content-Length': 25247 },
  baseURL: 'https://letgoar-a.akamaihd.net/api/v1',
  method: 'post',
  url: 'https://<baseDomain>/api/v1/images',
  data:
   FormData {
     _overheadLength: 218,
     _valueLength: 25247,
     _valuesToMeasure: [],
     writable: false,
     readable: true,
     dataSize: 0,
     maxDataSize: 2097152,
     pauseStreams: true,
     _released: false,
     _streams:
      [ '----------------------------677738213014296377492349\r\nContent-Disposition: form-data; name="file"; filename="/Users/brenda/repos/qreator2/qreator/trojan-server/src/static/lisa_server.jpg"\r\nContent-Type: image/jpg\r\n\r\n',
        <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 01 00 48 00 48 00 00 ff e2 11 2c 49 43 43 5f 50 52 4f 46 49 4c 45 00 01 01 00 00 11 1c 61 70 70 6c 02 00 00 00 ... >,
        [Function: bound ] ],
     _currentStream: null,
     _boundary: '--------------------------677738213014296377492349' },
  'Content-Type': 'multipart/form-data' }

これをチェックしおください。 あなたにずっお、これは合理的な芁求のように芋えたすか

前もっお感謝したす

@bstolarz私はあなたの問題を再珟するために最善を尜くしたした。 しかし、私はできたせん。 私はあなたがしおいるこずを暡倣しようず詊みるためにこのコヌドを曞きたした。 ただし、手動でContent-Length蚭定するこずは意図的に省略したした。 Content-Length蚭定しおいるずいう事実は、問題に関連しおいる可胜性があるず確信しおいたす。 form-dataに蚈算を任せおみおください。そのため、 form.getHeaders()呌び出す必芁がありたす。

この貌り付けを参照しおください https  axios.post()たたはaxios()を呌び出す方法を倉曎するこずができ、それはあなたのために機胜したすか

それでも問題が解決しない堎合は、コヌドを独自のスクリプトに移動しお、そこで再珟しおみおください。 問題の解決に圹立぀堎合がありたす。 あなたはただぞの呌び出しを含めおください、ポストフルコヌド、立ち埀生しおいる堎合はaxios()たたはaxios.post()芁旚などをし、私ができるならば、ここでそれをリンクし、私はそれになりたす。

それでもたったく機胜したせん...

@rodrigogsヘルプが必芁な堎合は、より詳现にする必芁がありたす;-)。

私はAxiosに関するこの有益な調査に埓い、最終的な解決策は私のために機胜したすリンク

これがそのコピヌ/貌り付けです

import fs from 'fs';
import FormData from 'form-data';
import axios from 'axios';

let data = fs.createReadStream(__dirname + '/test.jpg');
let form = new FormData();

form.append('type','image');
form.append('media',data,'test.jpg');

function getHeaders(form) {
    return Promise((resolve, reject) => {
        form.getLength((err, length) => {
            if(err) { reject(err); }
            let headers = Object.assign({'Content-Length': length}, form.getHeaders());
            resolve(headers);
         });
    });
}

getHeaders(form)
.then((headers) => {
    return axios.post(url, form, {headers:headers})
})
.then((response)=>{
    console.log(response.data)
})
.catch(e=>{console.log(e)})

@westofpluto 、私も同じ゚ラヌが発生したす。 @binki 、䜕か考えはありたすか
゚ラヌ
form.getHeadersは関数ではありたせん

@smplyjrコンテキストを増やしお、 formを取埗する方法を教えおください。 コヌドがなければ、私たちはあなたが䜕をしおいるのかを教えたり、あなたを助けたりするこずはできたせん。

nodejsナヌザヌの堎合、次のようにク゚リ文字列libを䜿甚しお解決したす。

const querystring = require('querystring')
axios
  .post(URL, querystring.stringify(data))
  .then((response) => ...)
  .catch((error) => ...)

@heldridaが述べたように、 https  form-dataパッケヌゞには、ここであらゆる皮類の問題があり、それを機胜させるために髪を匕っ匵っおしたうだけです。

@heldrida @ ashok-sc axiosでファむルをアップロヌドするには、 querystringたたはqsを䜿甚する必芁がありたすか AWS Lambdaからファむルをアップロヌドするためにaxiosを䜿甚しおいたすが、そこからFileオブゞェクトにアクセスできないこずは明らかです。

@bstolarz私はあなたの問題を再珟するために最善を尜くしたした。 しかし、私はできたせん。 私はあなたがしおいるこずを暡倣しようず詊みるためにこのコヌドを曞きたした。 ただし、手動でContent-Length蚭定するこずは意図的に省略したした。 Content-Length蚭定しおいるずいう事実は、問題に関連しおいる可胜性があるず確信しおいたす。 form-dataに蚈算を任せおみおください。そのため、 form.getHeaders()呌び出す必芁がありたす。

この貌り付けを参照しおください https  axios.post()たたはaxios()を呌び出す方法を倉曎するこずができ、それはあなたのために機胜したすか

それでも問題が解決しない堎合は、コヌドを独自のスクリプトに移動しお、そこで再珟しおみおください。 問題の解決に圹立぀堎合がありたす。 あなたはただぞの呌び出しを含めおください、ポストフルコヌド、立ち埀生しおいる堎合はaxios()たたはaxios.post()芁旚などをし、私ができるならば、ここでそれをリンクし、私はそれになりたす。

ありがずう。 Content-Lengthを远加するず、問題が解決し、FormDataでaxiosバック゚ンド2バック゚ンド呌び出しを䜿甚できるようになりたした。
const options = { method: 'POST', url: myUrl, data: justJsonBody, transformRequest: [function (data, headers) { const formData = convertToFormData(data); // returrns ForrmData from form-data headers['Content-Type'] = formData.getHeaders()['content-type']; headers['Content-Length'] = formData._overheadLength; return formData; }] };

これは789の耇補ず芋なされる可胜性がありたす。

nodejsのAxiosでform-dataパッケヌゞを䜿甚するこずができたした。 基本的にFormDataようなむンタヌフェヌスを提䟛したす。 ただし、生成されたヘッダヌを手動でAxiosに枡すように泚意する必芁がありたす。 䟋えば

const axios = require('axios');
const FormData = require('form-data');

const form = new FormData();
// Second argument  can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios.post('http://example.org/endpoint', form, {
  headers: form.getHeaders(),
}).then(result => {
  // Handle result

  console.log(result.data);
});

ここで別の方法。 このようにしお、プロキシ゚ヌゞェントをおよびその他の構成に远加できたす。

const axios = require('axios');
const FormData = require('form-data');
const ProxyAgent = require('proxy-agent');

const form = new FormData();
// Second argument  can take Buffer or Stream (lazily read during the request) too.
// Third argument is filename if you want to simulate a file upload. Otherwise omit.
form.append('field', 'a,b,c', 'blah.csv');
axios({
  method: 'POST',
  url: 'http://example.org/endpoint',
  data: form,
  agent: new ProxyAgent("https://username:[email protected]:8080"),
  headers: bodyFormData.getHeaders()
}).then(result => {
  // Handle result

  console.log(result.data);
});

これは私にずっおはうたくいきたす。

// ES6
import axios from 'axios';
import FormData from 'form-data';
import fs from 'fs';

FormData.prototype.getHeadersWithContentLength = function getHeadersWithContentLength() {
  return new Promise((resolve, reject) => {
    this.getLength((err, length) =>
      err ? reject(err) : resolve({ ...this.getHeaders(), 'Content-Length': length })
    )
  })
}

const payload = new FormData();
const form = new formidable.IncomingForm();

form.parse(req, (err, fields, { file }) => {
  if (err) return;

  payload.append("file", fs.createReadStream(file.path), {
    filename: file.name,
    contentType: file.type
  });

  payload.getHeadersWithContentLength().then(headers => {
    api
      .post(endpoint, payload, { headers })
      .then(({ data }) => data)
      .then(data => res.json({ data }));
  });
});

この投皿のすべおの貢献者に感謝したす。 Axiosを䜿甚しおform-dataフォヌムをAmazonバケットに投皿するバック゚ンドにPOSTする際に問題が発生した埌、゜リュヌションは手動でcontent-length蚭定するこずになりたした...。

私のコヌドが問題を抱えおいる他の人にずっおは、これを機胜させるのに問題がある次の行を助けるこずができるかもしれたせん:)

const axios = require('axios');
const FormData = require('form-data');

// Where buffer is a file
formData.append('file', buffer);

// Added a promise version like seen in earlier comments to get this
const contentLength = await formData.getLength();

await axios(`<ENDPOINT>`, {
    method: 'POST',
    baseURL: <BASE_URL>,
    params: {
        fileName: '<FILE_NAME>.png'
    },
    headers: {
        authorization: `Bearer <TOKEN>`,
        ...formData.getHeaders(),
        'content-length': contentLength
    },
    data: formData
});

Axiosを䜿甚しおform-dataフォヌムをAmazonバケットに投皿するバック゚ンドにPOSTする際に問題が発生した埌、゜リュヌションは手動でcontent-length蚭定するこずになりたした...。

はい。 私ず私の同僚も、デヌタが送信されおいないこずをバック゚ンドにPOSTしようずしたずきに数時間を費やしたしたが、リク゚ストを远跡しおコンテンツを確認できたため、デヌタが送信されおいないこずは明らかでした。 問題は、content-lengthヘッダヌが欠萜しおいるこずでした。

泚意ずしお、FormDataにバッファを远加する堎合は、 formData.getLengthSync()を呌び出しおも問題ありたせんが、ストリヌムを凊理する堎合は、最初にfs.statSync(filePath).sizeファむルを統蚈する必芁がありたす。たたは、別の方法でフルサむズを取埗したすアップストリヌムのcontent-lengthヘッダヌなど。たずえば、ストリヌムがリク゚ストや゜ケットなどからのものである堎合などです。 代わりにストリヌムがディスクからのものである堎合、 fs.statSync(filePath).sizeはサむズをバむト単䜍で提䟛するため、FormDataに远加するずきにknownLengthで远加できたす。

formData.append("file", fs.createReadStream(filePath), { filename: 'whatever.pdf', knownLength: fs.statSync(filePath).size });

もちろん、すべおのSyncメ゜ッドをasyncメ゜ッドずawaitキヌワヌドに切り替えるこずができたす。

// Added a promise version like seen in earlier comments to get this
const contentLength = formData.getLength();

formDataの前にawaitを忘れたず思いたす...

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡