2016-04-05 8 views
1

Ich habe den folgenden Code in Python bekam:Hochladen von zwei Dateien mit POST in 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) 

Und ich versuche es zu einer node.js Version zu konvertieren. So weit habe ich das:

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')); 

Was mache ich falsch? Diese

+0

Haben Sie einen Fehler erhalten und wenn ja, was genau ist der Fehler? –

+0

Nun habe ich die Dateinamen am Anfang von 'form.append' in' file [] 'geändert und nun sagt mir mein Backend, dass ich nicht die richtige Anzahl von Dateien hochgeladen habe (was zwei ist). – foxes

Antwort

0

ist, wie Sie es tun mit express und body-parser Modul die Post-Anforderung zu analysieren und holen Sie die Dateien, die Sie benötigen .Dies ist, was in Ihrem node.js Server geht.

Import alle Module:

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(); 
}); 

Konfigurieren Sie den Beitrag 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'}); 
}); 

Sicherstellen, dass alle Module installiert sind und vorhanden als Abhängigkeiten in package.json


CODE für einen API-Nachanruf vom Knoten ..

Fügen Sie das HTTP-Modul zuerst in Ihren Server ein.

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

Theninclude folgenden Code ein Post-Anforderung von dem Knoten-Server

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(); 

     }); 
    }); 

Bitte beachten Sie, dass Code, um nicht auf Live-Server getestet wurde, müssen Sie möglicherweise Änderung wie pro Ihre Konfiguration machen.

Sie können auch andere Bibliotheken wie request oder needler..etc verwenden, um Postanrufe vom Knotenserver zu machen, wie in this Post vorgeschlagen.

+0

Nun, es ist für eine Uni-Zuweisung, wo wir eine API erstellen müssen, und wir haben eine in Python erstellt und getestet, API-Aufrufe in Python zu machen - ist es für ein node.JS-Skript möglich, unsere API aufzurufen, ohne Knoten zu setzen .JS im Backend? – foxes

+0

können Sie das [http] (https://nodejs.org/dist/latest-v5.x/docs/api/http.html#http_http_request_options_callback) Modul von node .... verwenden, um einen API-Aufruf von innerhalb des Knotens zu machen. .. Ich habe Beispielcode in Antwort Update hinzugefügt ... Und über node.js nicht im Backend, das hängt davon ab, in welchem ​​Umfang Sie node.js in Ihrer Anwendung wollen. Sie können es entweder als Lightweight-Server für die Bereitstellung von HTML oder als Service-Layer-API verwenden. Es ist deine Entscheidung. – damitj07

+0

Ich bin mir nicht sicher, ob Sie mich richtig verstehen - wir verwenden node.JS überhaupt nicht in unserem Backend, wir verwenden Python/Flask. Aber wenn eine andere Klassenkameradin unsere API aufrufen möchte und ihr Projekt in node.JS war, würden sie das dann können? – foxes

Verwandte Themen