2015-11-17 7 views
13

क्योंकि मैंने इस सरल आवश्यकता को समझने में कुछ (बहुत अधिक) समय बिताया है। मैं कोआ के साथ multipart/form-data शरीर पार्सिंग प्राप्त करने का तरीका यहां दस्तावेज कर रहा हूं।कोआ के साथ मल्टीपार्ट/फॉर्म-डेटा बॉडी का विश्लेषण कैसे करें?

मेरे मामले में, भ्रम का कारण वहाँ बाहर उपलब्ध विकल्पों की संख्या था:

और मैं चाहता था सबसे कम से कम/के करीब खोजने के लिए चीजें करने केरास्ता/दर्शन।

तो यहां यह है। नीचे। स्वीकृत उत्तर में। उम्मीद है की यह मदद करेगा।

उत्तर

8

आपको koa-multer का उपयोग करना है जैसा कि आधिकारिक Koa wiki में बताया गया है।

तो एक साधारण सेटअप दिखाई देगा:

  • Multer केवल पार्स जाएगा प्रकार के अनुरोधों के शव multipart/form-data
  • सूचना उपयोग:

    const koa = require('koa'); 
    const multer = require('koa-multer'); 
    
    const app = koa(); 
    
    app.use(multer()); 
    
    app.use(function *() { 
        this.body = this.req.body; 
    }); 
    

    नोटों के एक जोड़े कोआ के सुपरचार्ज किए गए this.request के बजाय this.req.body (सुनिश्चित नहीं है कि यह जानबूझकर bu है टी यह यकीन है कि के लिए भ्रमित कर रहा है ... मैं पार्स bodythis.request पर उपलब्ध होने की उम्मीद होती है ...)

और FormData के रूप में इस HTML प्रपत्र भेजने:

<form> 
    <input type="hidden" name="topsecret" value="1"> 
    <input type="text" name="area51[lat]" value="37.235065"> 
    <input type="text" name="area51[lng]" value="-115.811117"> 
    ... 
</form> 

आप तक पहुँच दे सकते हैं नेस्टेड गुण के रूप में उम्मीद:

// -> console.log(this.req.body) 
{ 
    "topsecret": 1, 
    "area51": { 
    "lat": "37.235065", 
    "lng": "-115.811117", 
    } 
} 
+0

मैं वास्तव में [पूछा क्यों] (https://github.com/koa-modules/multer/issues/2) 'this.request पर नहीं उपलब्ध में भाग पार्स '। – eightyfive

3

मैं आप से एक ही जांच के माध्यम से चला गया और यहां multipart/form-data शरीर कोआ साथ पार्स करने को प्राप्त करने के अन्य तरीके हैं।

सह busboy:

var koa = require('koa'); 
var parse = require('co-busboy'); 

const app = koa(); 

app.use(function* (next) { 
    // the body isn't multipart, so busboy can't parse it 
    if (!this.request.is('multipart/*')) return yield next; 

    var parts = parse(this), 
     part, 
     fields = {}; 
    while (part = yield parts) { 
    if (part.length) { 
     // arrays are busboy fields 
     console.log('key: ' + part[0]); 
     console.log('value: ' + part[1]); 

     fields[part[0]] = part[1]; 
    } else { 
     // it's a stream, you can do something like: 
     // part.pipe(fs.createWriteStream('some file.txt')); 
    } 
    } 

    this.body = JSON.stringify(fields, null, 2); 
}) 

koa-शरीर:

var koa = require('koa'); 
var router = require('koa-router'); 
var koaBody = require('koa-body')({ multipart: true }); 

const app = koa(); 

app.use(router(app)); 

app.post('/', koaBody, function *(next) { 
    console.log(this.request.body.fields); 

    this.body = JSON.stringify(this.request.body, null, 2); 
}); 

दोनों ही मामलों में आप की तरह एक प्रतिक्रिया करना होगा:

{ 
    "topsecret": 1, 
    "area51": { 
    "lat": "37.235065", 
    "lng": "-115.811117", 
    } 
} 

लेकिन व्यक्तिगत रूप से, मैं रास्ता पसंद करते हैं ओए-बॉडी काम करता है। इसके अलावा, koa-validate जैसे अन्य मिडलवेयर के साथ संगत है।

इसके अलावा, अगर आप कोआ-शरीर के लिए एक अपलोड निर्देशिका निर्दिष्ट, यह अपलोड की गई फ़ाइल आप के लिए बचत होगी:

var koaBody = require('koa-body')({ 
    multipart: true, 
    formidable: { uploadDir: path.join(__dirname, 'tmp') } 
}); 
10

Koa2 के लिए, आप async-busboy उपयोग कर सकते हैं अन्य समाधान न के रूप में वादों का समर्थन या async/प्रतीक्षा। डॉक्स से

उदाहरण:

import asyncBusboy from 'async-busboy'; 

// Koa 2 middleware 
async function(ctx, next) { 
    const {files, fields} = await asyncBusboy(ctx.req); 

    // Make some validation on the fields before upload to S3 
    if (checkFiles(fields)) { 
    files.map(uploadFilesToS3) 
    } else { 
    return 'error'; 
    } 
} 
+0

ऑटोफिल्ड्स के साथ उपयोग करें। var parts = asyncBusboy का इंतजार करें (ctx.req, { ऑटोफ़िल्ड्स: सत्य // फ़ील्ड को भागों में सहेजता है। फ़ील्ड }); –

संबंधित मुद्दे