2015-11-17 35 views
13

Vì tôi đã dành một số thời gian (quá nhiều) để tìm ra yêu cầu đơn giản này. Tôi đang ghi lại ở đây cách để đạt được việc phân tích cú pháp cơ thể với Koa multipart/form-data.Làm cách nào để phân tích cú pháp nội dung đa phần/biểu mẫu với Koa?

Trong trường hợp của tôi, lý do của sự nhầm lẫn là con số lựa chọn thay thế có sẵn trên mạng:

Và tôi muốn để tìm tối giản nhất/gần với express/koa/node cách/triết lý làm việc.

Vì vậy, ở đây nó được. Phía dưới. Trong câu trả lời được chấp nhận. Hi vọng điêu nay co ich.

Trả lời

8

Bạn phải sử dụng koa-multer như đã nêu trong số Koa wiki chính thức.

Vì vậy, một thiết lập đơn giản sẽ như thế nào:

const koa = require('koa'); 
const multer = require('koa-multer'); 

const app = koa(); 

app.use(multer()); 

app.use(function *() { 
    this.body = this.req.body; 
}); 

Một vài ghi chú:

  • Multer sẽ chỉ phân tích các cơ quan yêu cầu của loại multipart/form-data
  • Thông báo việc sử dụng của this.req.body thay vì tăng áp của Koa this.request (không chắc chắn nếu đây là cố ý bu t này là khó hiểu cho chắc chắn ... Tôi mong chờ những phân tích cú pháp body có sẵn trên this.request ...)

Và gửi dưới dạng HTML này như FormData:

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

sẽ cung cấp cho bạn truy cập vào thuộc tính lồng nhau như mong đợi:

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

Tôi thực sự [hỏi tại sao] (https://github.com/koa-modules/multer/issues/2) phân tích cơ thể không có sẵn trên 'this.request '. – eightyfive

3

Tôi đã trải qua điều tra tương tự so với bạn và dưới đây là các cách khác để đạt được phân tích cú pháp nội dung với Koa multipart/form-data.

đồng hầu bàn:

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 thân:

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

Trong cả hai trường hợp, bạn sẽ có một phản ứng như:

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

Nhưng cá nhân tôi, Tôi thích cách k oa-cơ thể hoạt động. Plus, tương thích với các phần mềm trung gian khác như koa-validate.

Ngoài ra, nếu bạn chỉ định một thư mục tải lên Koa-cơ thể, nó sẽ lưu các tập tin được tải lên cho bạn:

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

Đối Koa2, bạn có thể sử dụng async-busboy như các giải pháp khác không hỗ trợ lời hứa hoặc async/await.

Ví dụ từ các tài liệu:

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

Sử dụng với autoFields. var parts = await asyncBusboy (ctx.req, { autoFields: true // lưu các trường vào parts.field (s) }); –

Các vấn đề liên quan