【问题标题】:how to handle xhr blob post in nodejs如何在nodejs中处理xhr blob post
【发布时间】:2016-05-26 22:15:05
【问题描述】:

客户端代码:

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: too many parameters 添加

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

不能解决问题。还有其他想法吗?

【问题讨论】:

  • 可以提供blob的内容吗?

标签: node.js post express xmlhttprequest


【解决方案1】:

假设您的 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());
  });
});

如果内容太大,即使对于结构化数据,在流式传输时处理请求也是一个好主意。例如,在过去,当我使用带有大 json 请求的 body-parser#json 中间件并解决删除 body-parser#json 中间件并使用 oboe 解析流输入时遇到性能问题。

【讨论】:

  • 你能提供一些相同的参考吗?
  • 传递给request 事件处理程序的req 参数是nodejs.org/api/http.html#http_class_http_incomingmessage 类的实例,并且根据文档,该类是可读流。使用该信息,您可以搜索节点流文档并使用示例代码中的可读流 api(注册 readable 事件处理程序)
【解决方案2】:

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

【讨论】:

  • 记得设置content-type并调用相应的bodyParser.method()。例如,如果 blob 包含图像,则内容类型应为 application/octet-stream,而要调用的 bodyParser 方法为 raw()。否则服务器会抛出错误。
猜你喜欢
  • 2021-11-26
  • 2016-08-27
  • 2011-08-15
  • 2018-11-25
  • 2016-08-23
  • 2015-12-28
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多