详解axios在node.js中的post使用(3)

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) { if (err) { cb(err); return; } values.forEach(function(length) { knownLength += length; }); cb(null, knownLength); }); };

formData已经封装好了得到长度的方法,只不过它是异步的,不过没关系,在实际项目中,可以将它手动Promise化。最终方案的代码也就自然出现了:

方案六:

let data = fs.createReadStream(__dirname + '/test.jpg') let form = new FormData() form.append('type','image') form.append('media',data,'test.jpg') form.getLength((err,length)=>{ if(err) console.log(err) let headers = Object.assign({'Content-Length':length},form.getHeaders()) axios.post(url,form,{headers:headers}).then((response)=>{ console.log(response.data) }) .catch(e=>{console.log(e)}) })

这时的请求打印后是这样的:

=============================================== { method: 'POST', url: 'https://www.jb51.net/', header: { accept: 'application/json, text/plain, */*', 'content-type': 'multipart/form-data; boundary=--------------------------424584867554529984619649', 'content-length': '186610', 'user-agent': 'axios/0.14.0', host: '127.0.0.1:3000', connection: 'close' } } ===============================================

事实证明它是可以工作的。

更进一步,我们把异步代码Promise一下,得到最终方案:

最终方案

let data = fs.createReadStream(__dirname + '/test.jpg') let form = new FormData() form.append('type','image') form.append('media',data,'test.jpg') let getHeaders = (form=>{ return new Promise((resolve,reject)=>{ form.getLength((err,length)=>{ if(err) reject(err) let headers = Object.assign({'Content-Length':length},form.getHeaders()) resolve(headers) }) }) }) getHeaders(form) .then(headers=>{ return axios.post(url,form,{headers:headers}) }) .then((response)=>{ console.log(response.data) }) .catch(e=>{console.log(e)})

总结

得到一个结论,多多看issue,多多看源码,多多了解基础知识(HTTP协议),对于问题的解决十分重要。最后这一套的实验代码放在github上了,需要研究研究的同学们可以看看:axios-request或者下载到本地学习

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wypgwx.html