0

Ich arbeite an einer iOS-App, die Bilder und Text an meinen Firebase-Server sendet mit mutipart/form-data URLRequest. Um die Daten in meiner Wolke Funktion zu verarbeiten, ich die Methode in documentation erwähnt bin mit den mutipart/form-data in JSON format, zu analysieren und hier ist mein Code:Mutipart/Form-Daten zu JSON in Node.js mit Busboy

const Busboy = require('busboy'); 

exports.test = functions.https.onRequest((req, res) => { 
    console.log("start"); 
    console.log(req.rawBody.toString()); 
    if (req.method === 'POST') { 
     var busboy = new Busboy({ headers: req.headers}); 
     busboy.on('field', (fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) => { 
      console.log('field'); 
     }); 

     busboy.on('finish', function() { 
      console.log('finish'); 
      res.json({ 
       data: null, 
       error: null 
      }); 
     }); 

     req.pipe(busboy); 
    } else { 
     console.log('else...'); 
    } 
}); 

jedoch der obige Code scheint nicht zu funktionieren und hier ist die Ausgabe von der Konsole:

Function execution started 
start 
--Boundary-43F22E06-B123-4575-A7A3-6C144C213D09 
Content-Disposition: form-data; name="json" 

{"name":"Alex","age":"24","friends":["John","Tom","Sam"]} 
--Boundary-43F22E06-B123-4575-A7A3-6C144C213D09-- 
finish 
Function execution took 517 ms, finished with status code: 200 

Wie Sie sehen können, die on('field') Funktion nie ausgeführt. Was habe ich verpasst?

Auch hier ist der Code in swift für das Senden von httpRequest:

var request = URLRequest(url: myCloudFunctionURL) 
request.httpMethod = "POST" 
request.setValue("multipart/form-data; boundary=myBoundary", forHTTPHeaderField: "Content-Type") 
request.addValue(userToken, forHTTPHeaderField: "Authorization") 
request.httpBody = myHttpBody 
let session = URLSession.shared 
session.dataTask(with: request) { (data, response, requestError) in 
    // callback 
}.resume() 
+0

Können Sie 'POST'-Verfahren einbeziehen? – Stamos

+0

Das Post-Verfahren ist enthalten. – AlexBains

+0

1. Versuchen Sie etwas wie POSTMAN, um einen Post mit Formulardaten zu machen und überprüfen Sie, ob Ihre Cloud-Funktion funktioniert. 2. Ihr Code sieht gut aus, außer dem Teil von 'myHttpBody'. Wenn Sie die Nachricht nicht korrekt erstellt haben, funktioniert sie nicht. – Stamos

Antwort

0

Sie busboy.end(req.rawBody); statt req.pipe(busboy) verlangen, wie im Beispiel der Dokumentation beschrieben. Ich weiß nicht, warum .pipe nicht funktioniert. Rufen Sie .end wird das gleiche Ergebnis, aber auf andere Weise.

const Busboy = require('busboy'); 

exports.helloWorld = functions.https.onRequest((req, res) => { 

     const busboy = new Busboy({ headers: req.headers }); 
     let formData = {}; 

     busboy.on('field', (fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) => { 
      // We're just going to capture the form data in a JSON document. 
      formData[fieldname] = val; 
      console.log('Field [' + fieldname + ']: value: ' + val) 
     }); 

     busboy.on('finish',() => { 
      res.send(formData); 
     }); 

     // The raw bytes of the upload will be in req.rawBody. 
     busboy.end(req.rawBody); 

});