2016-02-15 32 views
2

客户端代码:如何处理XHR的NodeJS BLOB后

var xhr = new XMLHttpRequest(); 
xhr.open('POST', '/frame', true); 
xhr.send(blob); 

服务器代码:

app.use(bodyParser.urlencoded({extended: false,limit: '50mb'})); 
app.post('/frame', function (req, resp) { 
    console.log(req.body); 
}); 

这给PayloadTooLargeError:太多的参数 加入

xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded'); 

不解决这个问题。任何其他想法?

+0

你能提供blob的内容吗? – leobelizquierdo

回答

3

假设你的BLOB变量是不是真的URL编码形式的数据,只是任何类型的内容。然后在服务器端,您可以读取请求流。请记住,您的http.Server.request事件处理程序中的req变量是可读流。这将消除由body-parser中间件施加的任何大小限制。保持你原有的客户端代码,然后你的服务器代码将是:

// app.use(bodyParser.urlencoded({extended: false,limit: '50mb'})); 

app.post('/frame', function (req, resp) { 
    req.on('readable', function(){ 
    console.log(req.read()); 
    }); 
}); 

处理请求,因为它是在流甚至是结构化数据是个好主意,如果内容是太大。例如,在过去,我在使用body-parser#json中间件时遇到了性能问题,并提供了大的json请求,并解决了删除中间件body-parser#json和使用oboe解析流式输入的问题。

1

您的blob变量超过服务器中设置的限制大小。您必须设置一个总是大于客户数据的数字(blob)。

客户端:

var xhr = new XMLHttpRequest(); 
xhr.open('POST', '/frame', true); 
xhr.setRequestHeader('Content-type','application/x-www-form-urlencoded'); 
xhr.send(blob); 

服务器:

// set limit with a value always bigger than the client data 
var upperBound = '1gb'; 
app.use(bodyParser.urlencoded({extended: false, limit: upperBound})); 
app.post('/frame', function (req, resp) { 
    console.log(req.body); 
}); 
+0

记得设置'content-type'并调用适当的'bodyParser.method()'。例如,如果blob包含一个图像,content-type应该是'application/octet-stream',而'bodyParser'方法是'raw()'。否则服务器会抛出错误。 – Menixator