问题产生的原因,node服务启动,不是简单的转发,有一些功能在,但一些真正的功能还需要再一次转发到真正的后台去处理,就是所有的请求都会在这过滤,处理后才可能被转发。
如果用node直接代理过去,文件上传,同时还要提交其他的数据功能没有问题,把node功能用起来,就有问题了,个人觉得应该是在请求处理然后转发的过程中,对请求的参数造成了影响(具体当时没有仔细去研究,有知道的可以告知一声啊~),最后解决这个问题的方法是这样的,在node端将收到的文件数据通过writeSteam转化成数据流再传给后端,如果上传请求中附有属性等数据,则最后通过formdata模块转化后整体转发。具体可参考如下:(单纯的文件上传貌似没有这个问题的)
const handleReqBody = (ctx, body) => {
if (ctx.is('multipart/form-data')) {
const file = _.get(body, 'files.file')
delete ctx.headers['content-type']
// const formData = new FormData()
// formData.append('file', createReadStream(file.path))
// _.forEach(body.fields, (val, key) => {
// formData.append(key, val)
// })
return createReadStream(file.path)
} else {
return _.isObject(body) ? JSON.stringify(body) : body
}
}
自此文件上传就有了阴影,附上一个前端处理文件上传的示例(直接upload组件的action就不多说了):
uploadData (file) {
// if (this._isEmpty(file)) {
// this.$Message.error('请先选择上传文件')
// } else {
let formData = new window.FormData()
formData.append('file', file)
formData.append('key1', val1)
formData.append('key2', val2)
this.$http.post('/file/productExcel', formData).then(res => {
if (res.rtnCode === '000') {
// do something
this.$Message.success('上传文件成功')
} else {
this.$Message.error({
content: res.rtnMsg,
duration: 3
})
}
}).catch(err => {
console.log(err)
})
// }
}