2016-04-05 24 views
1

にPOSTを持つ2つのファイルをアップロードする:は、私はPythonで、次のコードを持っているNode.jsの

import requests 
fileslist = [('file[]',('user_query.txt', open('user_query.txt', 'rb'), 'text/plain')), 
       ('file[]',('wheatData.csv', open('wheatData.csv', 'rb'), 'text/csv')),] 

r = requests.post('url', 
    files=fileslist) 

そして私は、Node.jsのバージョンに変換しようとしています。これまで私はこれを持っています:

var request = require('request'); 
var fs  = require('fs'); 

var req = request.post(url, function (err, resp, body) { 
    if (err) { 
    console.log('Error!'); 
    } else { 
    console.log(body); 
    } 
}); 

var form = req.form(); 
form.append('wheatData.csv', fs.createReadStream('wheatData.csv')); 
form.append('user_query.txt', fs.createReadStream('user_query.txt')); 

私は間違って何をしていますか?

+0

エラーが発生しましたか?そうであれば、エラーはどうなりますか? –

+0

さて、私は 'form.append'の先頭にあるファイル名を' file [] 'に変更しました。そして、私のバックエンドは正しいファイル数(2つです)をアップロードしていないことを教えてくれます。 – foxes

答えて

0

は、これは、あなたが.ThisがあなたのNode.jsサーバに何が起こるのかである必要があるファイルをPOSTリクエストを解析し、取得するためにexpressbody-parserモジュールを使用してそれを行う方法です。

インポートするすべてのモジュール:

var express = require("express"); 
var bodyParser = require('body-parser') 
var app = express(); //init express app() 
var util = require('util'); 

//APP CONFIGURATION >> Skip this if you dont want CORS 
app.use(express.static('app')); // use this as resource directory 
app.use(function (req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    next(); 
}); 

設定投稿のURL:

//url => url/for/mypostrequest 
app.post(url, done, function (req, res) { 

    //Handle the post request body here... 
    var filesUploaded = 0; 
    //check if files present 
    if (Object.keys(req.files).length === 0) { 
     console.log('no files uploaded'); 
    } else { 
     console.log(req.files); 
     var files = req.files.file1; 
     //If multiple files store in array.. 
     if (!util.isArray(req.files.file1)) { 
      files = [req.files.file1]; 
     } 
     filesUploaded = files.length; 
    } 
    res.json({message: 'Finished! Uploaded ' + filesUploaded + ' files. Route is /files1'}); 
}); 

は、すべてのモジュールがインストールされていることを確認し、package.json


で依存関係として存在してくださいノードからのapiポストコールを行うためのコード..

サーバーに最初にhttpモジュールを含めます。

var http = require('http'); 
var querystring = require('querystring'); 
var fs = require('fs'); 

Theninclude次のコードは、

var file1, file2; 
    //Read first File ... 
    fs.readFileSync('wheatData.csv', function (err, data) { 
     if (err) { 
      console.log('Error in file reading...'); 
     } 
     file1 = data; 

     //Read second file.... 
     fs.readFileSync('wheatData.csv', function (err, data) { 
      if (err) { 
       console.log('Error in file reading...'); 
      } 
      file2 = data; 

      //Construct the post request data.. 
      var postData = querystring.stringify({ 
       'msg': 'Hello World!', 
       'file1': file1, 
       'file2': file2 
      }); 
      var options = { //setup option for you request 
       hostname: 'www.path/to/api/', 
       port: 80, 
       path: '/upload', 
       method: 'POST', 
       headers: { 
        'Content-Type': 'application/x-www-form-urlencoded', 
        'Content-Length': postData.length 
       } 
      }; 
      var req = http.request(options, function (res) { 
       console.log('STATUS:' + res.statusCode); 
       console.log('HEADERS:' + JSON.stringify(res.headers)); 
       res.setEncoding('utf8'); 
       res.on('data', function (chunk) { 
        console.log('BODY: ' + chunk); 
       }); 
       res.on('end', function() { 
        console.log('No more data in response.'); 
       }); 
      }); 
      req.on('error', function (e) { 
       console.log('problem with request: ' + e.message); 
      }); 
      // write data to request body 
      req.write(postData); 
      req.end(); 

     }); 
    }); 

は、そのコードがライブサーバー上でテストされていませんのでご注意くださいノードサーバからのPOSTリクエストを作るために、あなたはあなたの設定に従って変更を行う必要があるかもしれません。

また、thisで提案されているように、requestやneedler..etcのような他のライブラリを使用してノードサーバからのポストコールを行うことができます。

+0

APIを作成しなければならないユニ・アサインメントで、Pythonで作成してPythonでAPI呼び出しをテストしています - node.JSスクリプトがノードを置かずにAPIを呼び出すことは可能でしょうかバックエンドの.JS? – foxes

+0

ノードの[http](https://nodejs.org/dist/latest-v5.x/docs/api/http.html#http_http_request_options_callback)モジュールを使用して、ノード内部からapi呼び出しを行うことができます。 ..私は答えの更新でサンプルコードを追加しました... node.jsがあなたのアプリケーション内でnode.jsをどれだけ必要とするかに依存するバックエンドにないことについて。 これは、htmlを提供する軽量サーバーとして、またはサービスレイヤAPIとして使用できます。それは完全にあなたの決定です。 – damitj07

+0

あなたが私を正しく理解しているかどうかは分かりません。ノードは使用していません。バックエンドではPython/Flaskを使用しています。しかし、別のクラスメートが私たちのAPIを呼びたいと思っていて、彼らのプロジェクトがnode.JSにあったなら、彼らはそれを実行できるでしょうか? – foxes

関連する問題