2016-10-03 11 views
0

node-jshttps://www.npmjs.com/package/requestを使用してバックエンドを開発して、メインAPIにリクエストを引き渡します。新しいFormdata()からNPMリクエストを使用してファイルをアップロード

は、文字列または数字の形式でデータを正常に送信しました。ファイルを送信するには問題があります。要求モジュールに入る前に、私はあなたのようなものを使用する必要がありますどのようなファイルを送信するためにNPM要求

export function requestAPI(method='GET', endpoint='', params={}, callback) 
{ 
    let token = '' 
    if(params.token) 
    { 
     token = params.token; 
     delete params.token; 
    } 

    //set query 
    if(params.query) 
    { 
     endpoint = `${endpoint}?${Url.serialize(params.query)}` 
     delete params.query 
    } 

    //set options 
    let options = { 
     method: method, 
     uri: `${process.env.API_HOST}${endpoint}`, 
     timeout: 6000, 
     headers: { 
      'auth' : token 
     }, 
    }; 

    // upload files 
    // ??? 

    // using POST method 
    if(method === 'POST') { 
     options['form'] = params; 
    } 

    // is upload a file - request via multipart/form-data 


    //start request 
    try { 
     request(options , function(error, response, body){ 
      if(error) 
      { 
       console.log(error) 
       return callback(httpException(500)); 
      } else //success 
      { 
       return callback(JSON.parse(body)); 
      } 
     }) 
    } catch(err) { 
     return callback(httpException(500, err.message+', '+err.stack)); 
    } 
} 

答えて

1

助けてくれてありがとう、最終的に私はそれを解決する答えを見つけました。このライン上の

問題

if(method === 'POST') { 
    options['form'] = params; 
} 

私はちょうどそれが

if(method === 'POST') { 
    options['formData'] = params; 
} 

を作品にするために、これに変更し、これはコード

export function requestAPI(method='GET', endpoint='', params={}, callback) 
{ 
    let token = '' 
    if(params.token) 
    { 
     token = params.token; 
     delete params.token; 
    } 

    //set query 
    if(params.query) 
    { 
     endpoint = `${endpoint}?${Url.serialize(params.query)}` 
     delete params.query 
    } 

    //set options 
    var options = { 
     method: method, 
     uri: `${process.env.API_HOST}${endpoint}`, 
     timeout: 30000, 
     headers: { 
      'auth' : token 
     }, 
    }; 

    // using POST method 
    if(method.toLowerCase() === 'post') { 
     options.formData = params; 

     // upload files 
     if(options.formData.files) 
     { 
      const files = options.formData.files 
      delete options.formData['files'] 

      Object.keys(files).map(n => { 
       options.formData[n] = { 
        value: fs.createReadStream(files[n]._writeStream.path), 
        options: { 
         filename: files[n].name, 
         type: files[n].type 
        } 
       } 
      }) 
     } 
    } 

    //start request 
    try { 
     request(options , function(error, response, body){ 
      if(error) 
      { 
       return callback(httpException(500)); 
      } else //success 
      { 
       return callback(JSON.parse(body)); 
      } 
     }) 
    } catch(err) { 
     return callback(httpException(500, err.message+', '+err.stack)); 
    } 
} 
の完了
1

を使用して、私のコードこれは

new formdata()

エンドを使用して、クライアントからのすべての要求を変換する必要がありapplication/jsonの代わりにmultipart/form-dataです。また、formの代わりにformDataオプションを使用する必要があります。たとえば、次のように続いて

var options = { 
    method: method, 
    uri: `${process.env.API_HOST}${endpoint}`, 
    timeout: 6000, 
    headers: { 
     'auth' : token, 
    }, 
}; 

// using POST method 
if (method === 'POST') { 
    options.formData = params; 
} 

requestおよび/またはform-dataモジュールのドキュメントで概説されているようあなたが任意の値を使用することができparams内部。関連request multipart/form-data exampleに示すように、明示的に別のファイル名および/またはMIMEタイプを設定することができますファイルの場合

var fs = require('fs'); 

// ... 

params.avatar = fs.createReadStream('avatar.jpg'); 

:だから、ローカルファイルに対して、あなただけ読めるストリームを使用することができます。

関連する問題