console.log(response.data)
})
.catch(e=>{console.log(e)})
但是结果表明,这样还是不行,现在的请求是这样:
===============================================
{ method: 'POST',
url: '/',
header:
{ accept: 'application/json, text/plain, */*',
'content-type': 'multipart/form-data; boundary=--------------------------171407872885673042671614',
'user-agent': 'axios/0.14.0',
host: '127.0.0.1:3000',
connection: 'close',
'transfer-encoding': 'chunked' } }
===============================================但是我目前项目需求是,不使用chunked而采用content-length的方法来传输,这意味着,我要想办法搞到form的长度
在成功案例中,使用requests,于是我翻看了部分源码: 在request/request.js里出现了
function setContentLength () {
if (isTypedArray(self.body)) {
self.body = new Buffer(self.body)
} if (!self.hasHeader('content-length')) {
var length
if (typeof self.body === 'string') {
length = Buffer.byteLength(self.body)
}
else if (Array.isArray(self.body)) {
length = self.body.reduce(function (a, b) {return a + b.length}, 0)
}
else {
length = self.body.length
}
if (length) {
self.setHeader('content-length', length)
} else {
self.emit('error', new Error('Argument error, options.body.'))
}
}
}
它采用Buffer来计算长度,然后添加到headers中去
然后看看在axios里是如何做的: axios/lib/adapters/http.js里出现了
if (data && !utils.isStream(data)) {
if (utils.isArrayBuffer(data)) {
data = new Buffer(new Uint8Array(data));
} else if (utils.isString(data)) {
data = new Buffer(data, 'utf-8');
} else {
return reject(createError(
'Data after transformation must be a string, an ArrayBuffer, or a Stream',
config
));
} // Add Content-Length header if data exists
headers['Content-Length'] = data.length;
}
下文并没有出现else,所以,当data是stream的时候,并没有自动设置content-length
所以,我需要在formData.getHeaders()后,再添加一个content-length的key
想要计算长度,自然想到去看看源码,于是在form-data/lib/form_data.js中出现了惊喜:
FormData.prototype.getLength = function(cb) {
var knownLength = this._overheadLength + this._valueLength; if (this._streams.length) {
knownLength += this._lastBoundary().length;
}
if (!this._valuesToMeasure.length) {
process.nextTick(cb.bind(this, null, knownLength));
return;
}
asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {









