2015-08-26 12 views
5

Tôi đã tạo API bằng cách sử dụng io.jskoa.js.Truy cập phần nội dung thô của yêu cầu trong koa.js

Là phần mềm trung gian phân tích cú pháp nội dung Tôi đang sử dụng koa-body, lần lượt sử dụng co-body.

Trên một trong các điểm cuối API của tôi, tôi nhận được yêu cầu POST và tôi cần quyền truy cập vào phần thô của yêu cầu, vì tôi cần mã hóa để xác minh xem yêu cầu có hợp lệ hay không.

Có cách nào để truy cập vào phần nội dung thô của yêu cầu không? Tôi đã cố gắng sử dụng phần mềm trung gian raw-body, nhưng nếu tôi sử dụng nó trước khi tôi gọi koa-body, số co-body được sử dụng trong các lần ngắt koa-body. Nếu tôi sử dụng nó sau koa-body nó không hoạt động.

app.use(function*(next){ 
    let rawRequestBody = yield rawBody(this.req); 
    this.rawRequestBody = rawRequestBody; 

    yield next; 
    }); 

EDIT:

Tôi nghĩ rằng tôi tìm thấy một workaround, nhưng tôi không biết nếu điều này là giải pháp tốt nhất. Tôi nghĩ rằng câu trả lời @greim có thể là một giải pháp tốt hơn cho vấn đề này.

tôi đã thêm đoạn mã sau trước khi tôi sử dụng koa-body:

app.use(function *(next) { 

    let url = this.req.url; 

    if(this.req.method == 'POST') { 
     let that = this; 
     this.req.rawBody = ''; 

     this.req.on('data', function(chunk) { 
     that.req.rawBody += chunk; 
     }); 
    } 

    yield next; 
    }); 

Trả lời

6

Nó chỉ có ý nghĩa để nắm bắt các dòng cùng một lúc.

Bạn có thể chụp nội dung yêu cầu dưới dạng chuỗi hoặc bộ đệm (Tôi giả định đây là ý của bạn bằng nội dung "thô") bằng cách sử dụng tiện ích raw-body và sau đó giữ tham chiếu đến nó như được hiển thị trong mã của riêng bạn, :

let rawRequestBody = yield rawBody(this.req); 
this.rawRequestBody = rawRequestBody; 
console.log(typeof this.rawRequestBody); // "string" 

Khi bạn làm điều đó, không còn sử dụng koa-body hoặc co-body, kể từ khi những người cũng là tiện ích dòng-chụp mà giả sử bạn chưa nắm bắt được dòng. Để làm cho cơ thể yêu cầu truy cập như JSON (ví dụ) chỉ đơn giản là làm điều này:

this.jsonRequestBody = JSON.parse(this.rawRequestBody); 
console.log(typeof this.jsonRequestBody); // "object" 
1

Tại sao chúng ta không thể sử dụng nhiều phân tích cú pháp cơ thể (co-cơ thể, koa-cơ thể) là bởi vì, định nghĩa nó phải chuẩn bị ctx. request.body cho phần mềm trung gian tiếp theo để sử dụng, điều này có nghĩa là khi một phần mềm trung gian phân tích cú pháp cơ thể "chờ đợi tiếp theo()" để chuyển điều khiển sang phần mềm trung gian tiếp theo, ctx.req được tiêu thụ (hoặc kết thúc).

Bất kỳ phần mềm trung gian nào của trình phân tích cú pháp cơ thể để phối hợp với người tiêu dùng cơ thể yêu cầu khác (phải nghe sự kiện "dữ liệu" hoặc "kết thúc" trên ctx.req), phải đảm bảo "đồng bộ hóa" sự kiện nghe (như "dữ liệu" hoặc "kết thúc") trên ctx.req. Điều này không đúng đối với cơ thể và thân thể (sử dụng đồng cơ thể), thực hiện trong các sự kiện "Promise.resolve().", Nếu "dữ liệu" hoặc "kết thúc" được kích hoạt trước khi nghe sự kiện này, dữ liệu bị thiếu (mất sự kiện "dữ liệu") hoặc lỗi (nghe trên luồng đã kết thúc) sẽ xảy ra.

@greim là đúng, nhưng phần lớn thời gian, chúng tôi sử dụng phần mềm trung gian cấp cao (chẳng hạn như joi-router) có sức mạnh để sử dụng phần mềm trung gian phân tích cú pháp cơ thể và chúng tôi không kiểm soát được, đây vẫn là vấn đề.

+0

sửa chữa của tôi trên đồng cơ thể: https://github.com/cojs/co-body/pull/59 – tangxinfa

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