0

私は、mutipart/form-data URLRequestを使用して、イメージとテキストをファイアベースサーバに送信するiosアプリケーションで作業しています。私のクラウド機能でデータを処理するために、私はJSON formatmutipart/form-dataを解析するdocumentationに記載の方法を使用して、そしてここにいることは私のコードです:Busboyを使用したNode.jsのJSONへのMutipart/form-data

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

しかし、上記のコードは動作していないようあなたが見ることができるように、on('field')関数が実行されません

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 

:、ここコンソールから出力されます。私は何を取りこぼしたか?

はまた、ここにhttpRequestを送信するためswiftのコードは次のとおりです。

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

'POST'プロシージャを含めることができますか? – Stamos

+0

ポストプロシージャが含まれています。 – AlexBains

+0

1. POSTMANのようなものを使って、フォームデータで投稿を行い、クラウド機能が動作することを確認します。 2.あなたのコードは、 'myHttpBody'作成の部分を除いて、よく見えます。メッセージを正しく作成していない場合は正しく動作しません。 – Stamos

答えて

0

あなたはドキュメントの例で説明したようにbusboy.end(req.rawBody);の代わりreq.pipe(busboy)を呼び出す必要があります。私はなぜ.pipe doesntの仕事を知っていません。 .endを呼び出すと、同じ結果が得られますが、方法は異なります。

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

}); 
関連する問題