2013-06-21 12 views
5

Tôi làm cách nào để có quyền truy cập vào dữ liệu POST trong yêu cầu, nếu express bodyParser không kích hoạt?Làm cách nào để phân tích cú pháp yêu cầu HTTP với loại nội dung bị thiếu trong Express/NodeJs, bằng cách giả định loại nội dung mặc định?

var server = express(); 
server.use(express.bodyParser()); 
server.post('/api/v1', function(req, resp) { 
    var body = req.body; 
    //if request header does not contain 'Content-Type: application/json' 
    //express bodyParser does not parse the body body is undefined 
    var out = { 
    'echo': body 
    }; 
    resp.contentType('application/json'); 
    resp.send(200, JSON.stringify(out)); 
}); 

Lưu ý: trong ExpressJs 3.x + req.body là không tự động có sẵn, và đòi hỏi bodyParser để kích hoạt.

Nếu tiêu đề loại nội dung không được đặt, bạn có thể chỉ định loại nội dung mặc định là application/json và kích hoạt bodyParser không?

Nếu không, có thể truy cập dữ liệu POST bằng cách sử dụng cách nút trần từ bên trong hàm POST nhanh này không?

(ví dụ req.on('data', function...)

+2

chỉ sử dụng 'req.on ('data')' hoặc 'req.headers ['content-type'] = req.headers ['content-type'] || 'application/json'' trước trình phân tích cú pháp cơ thể, nhưng thực sự đây là lỗi máy khách. –

+0

@JonathanOng cảm ơn. Vâng, tôi biết rằng đây là lỗi của khách hàng - chỉ cố gắng khắc phục nó. Làm thế nào tôi sẽ đi về làm một cái gì đó trước khi phân tích cú pháp cơ thể đá vào? AFAICT, nó đã được kích hoạt khi chức năng gọi lại PUT nhanh được nhập vào. – bguiz

Trả lời

12

Bạn có một loạt các tùy chọn bao gồm tự viện dẫn rõ ràng (kết nối, thực sự) chức năng trung gian cho mình (thực sự, hãy đọc mã nguồn. Họ chỉ là chức năng và không có ma thuật sâu để làm bạn bối rối). Vì vậy:

function defaultContentTypeMiddleware (req, res, next) { 
    req.headers['content-type'] = req.headers['content-type'] || 'application/json'; 
    next(); 
} 

app.use(defaultContentTypeMiddleware); 
app.use(express.bodyParser()); 
+0

cảm ơn câu trả lời - chỉ cần kiểm tra rằng vì chúng tôi đang sử dụng loại nội dung dưới dạng băm trực tiếp, liệu cách viết hoa có ảnh hưởng đến điều này không? tức là 'req.headers ['content-type']' vs 'req.headers ['Content-Type']'? – bguiz

+0

Chúng được hạ thấp cho bạn. http://nodejs.org/docs/latest/api/all.html#all_message_headers –

+0

@ Peter Lyons Thật không may, việc đặt thuộc tính tiêu đề theo cách này dường như không ảnh hưởng đến 'bodyParser'. Cảm ơn vì đã cho tôi ý tưởng viết phần mềm trung gian của riêng tôi - không biết tại sao nó không xảy ra với tôi để làm điều đó - nhưng cuối cùng những gì tôi làm là viết phần mềm trung gian của riêng tôi, mà về cơ bản là một wrapper tối thiểu xung quanh 'req.on ('dữ liệu', hàm ...' và 'JSON.parse'. +1 và kiểm tra cho bạn! – bguiz

3

Tôi sử dụng phần mềm trung gian này, trước khi bodyParser khởi động, điều này có thể hữu ích. Nó nhìn vào byte đầu tiên của luồng yêu cầu và đoán. Ứng dụng cụ thể này chỉ thực sự xử lý luồng văn bản XML hoặc JSON.

app.use((req,res, next)=>{ 
    if (!/^POST|PUT$/.test(req.method) || req.headers['content-type']){ 
     return next(); 
    } 
    if ((!req.headers['content-length'] || req.headers['content-length'] === '0') 
      && !req.headers['transfer-encoding']){ 
     return next(); 
    } 
    req.on('readable',()=>{ 
     //pull one byte off the request stream 
     var ck = req.read(1); 
     var s = ck.toString('ascii'); 
     //check it 
     if (s === '{' || s==='['){req.headers['content-type'] = 'application/json';} 
     if (s === '<'){req.headers['content-type'] = 'application/xml'; } 
     //put it back at the start of the request stream for subsequent parse 
     req.unshift(ck); 
     next(); 
    }); 
}); 
Các vấn đề liên quan