我的快递服务器从浏览器接收文件上传。上传作为multipart/form-data
请求传输;我使用多方来解析传入的实体主体。
Multiparty 允许您将一部分(大致是一个像 an 的表单字段<input type="file">
)作为可读流。我不想在我的网络服务器上处理或存储上传的文件,所以我只是将上传的文件部分通过管道发送到另一个服务的请求中(使用请求模块)。
app.post('/upload', function(req, res) {
var form = new multiparty.Form();
form.on('part', function(part) {
var serviceRequest = request({
method: 'POST',
url: 'http://other-service/process-file',
headers: {
'Content-Type': 'application/octet-stream'
}
}, function(err, svcres, body) {
// handle response
});
part.pipe(serviceRequest);
});
form.parse(req);
});
这在大多数情况下都能正常工作。节点自动应用分块传输编码,并且随着浏览器上传文件字节,它们被正确地作为原始实体主体(没有多部分格式)发送到后端服务,最终得到完整的文件并成功返回。
但是,有时请求会失败,并且我的回调会被调用err
:
TypeError: The header content contains invalid characters
at ClientRequest.OutgoingMessage.setHeader (_http_outgoing.js:360:11)
at new ClientRequest (_http_client.js:85:14)
at Object.exports.request (http.js:31:10)
at Object.exports.request (https.js:199:15)
at Request.start (/app/node_modules/request/request.js:744:32)
at Request.write (/app/node_modules/request/request.js:1421:10)
at PassThrough.ondata (_stream_readable.js:555:20)
at emitOne (events.js:96:13)
at PassThrough.emit (events.js:188:7)
at PassThrough.Readable.read (_stream_readable.js:381:10)
at flow (_stream_readable.js:761:34)
at resume_ (_stream_readable.js:743:3)
at _combinedTickCallback (internal/process/next_tick.js:80:11)
at process._tickDomainCallback (internal/process/next_tick.js:128:9)
我无法解释该错误来自何处,因为我只设置了Content-Type
标题并且堆栈不包含我的任何代码。
为什么我的上传偶尔会失败?