圖上的結(jié)果是:我在mavoneditor編輯器里面上傳第一張圖片時,可以正確從服務(wù)端返回圖片的網(wǎng)絡(luò)地址,再上傳第二張圖片的時候,就報(bào)錯了,圖片地址任然是本地地址。
從信息上也看出我第一次post /upload 是成功的,前端也正確get 到了服務(wù)端圖片地址,第二次post卻發(fā)生錯誤了,錯誤信息 Can't set headers after they are sent
但第二次上傳的圖片卻已經(jīng)上傳到了服務(wù)端
雖然從圖上看不出來,但upload里面的確多了一張圖片
上傳圖片的前端代碼
<el-form-item label="商品詳情" prop="info">
<mavon-editor ref="md" @imgAdd="$imgAdd" @imgDel="$imgDel" v-model="addprod.info"></mavon-editor>
</el-form-item>
// 圖片上傳并替換地址
// 綁定@imgAdd event
$imgAdd (pos, $file) {
// 第一步.將圖片上傳到服務(wù)器.
let formdata = new FormData()
formdata.append('file', $file)
// let uploadparams = {
// data: formdata,
// headers: { 'Content-Type': 'multipart/form-data' }
// }
// console.log('pos: ' + pos, formdata, $file)
UploadFile(formdata)
.then(url => {
// console.log(url)
console.log(this.addprod.info)
// 第二步.將返回的url替換到文本原位置 -> 
this.$refs.md.$img2Url(pos, url.data)
})
}
// 上傳圖片接口
export const UploadFile = params => {
return axios({
url: base + '/upload',
method: 'post',
headers: { 'Content-Type': 'multipart/form-data' },
data: params
})
}
服務(wù)端代碼
const {User, Product} = require('../models/model')
const formidable = require('formidable')
const form = new formidable.IncomingForm()
const path = require('path')
const fs = require('fs')
module.exports = {
// 注冊
regin: async (req, res, next) => {
const newuser = new User(req.body)
const adduser = await newuser.save()
res.status(200).send({
adduser: adduser
})
},
// 登錄
login: async (req, res, next) => {
const user = await User.findOne(req.query)
res.status(200).json({
code: 200,
msg: '登錄成功',
user: user
})
},
// 上傳圖片
upload: (req, res, next) => {
//上傳文件的保存路徑
form.uploadDir = path.dirname('./upload/upload/')
//保存擴(kuò)展名
form.keepExtensions = true
//上傳文件的最大大小
form.maxFieldsSize = 20 * 1024 * 1024
form.parse(req, (err, fields, files) => {
// 項(xiàng)目未打包時使用
const imagepath = 'http://localhost:8088/' + path.normalize(files.file.path)
// 項(xiàng)目打包到server之后使用
// const imagepath = path.normalize(files.file.path)
res.status(200).send(imagepath)
// return next()
})
},
// 發(fā)送文件
sendfile: (req, res, next) => {
// console.log(req.params)
const curfile = path.resolve(__dirname,'../upload/' + req.params.imagename)
// console.log(curfile)
res.status(200).sendFile(curfile)
// return next()
}
}
查了好多資料,大概知道這個錯誤是因?yàn)?我在發(fā)了一次http響應(yīng)頭之后又發(fā)了一次響應(yīng)頭,程序做出了重復(fù)響應(yīng),但我檢查了半天也沒發(fā)現(xiàn)哪里重復(fù)謝了多個res.xxx啊,其它寫return的辦法也試過,還是沒解決。
同時前端會有一個跨域代理的錯誤
[HPM] Error occurred while trying to proxy request //upload from localhost:8080 to http://localhost:8088 (ECONNRESET) (https://nodejs.org/api/errors...
_common_system_errors)
為了測試是否與跨域代理有關(guān)系,我將項(xiàng)目打包放到服務(wù)端測試,發(fā)現(xiàn)還是一樣的錯誤,再次求助各位幫忙看看解決,先謝過了!!
遇到類似問題,官方文檔往往是最好的解答。試下把你的代碼改成下面這樣,唯一的不同,就是把form的實(shí)例化挪動動 upload 里。
// 上傳圖片
upload: (req, res, next) => {
const form = new formidable.IncomingForm() // 注意,把form 的實(shí)例化操作挪進(jìn)來
//上傳文件的保存路徑
form.uploadDir = path.dirname('./upload/upload/')
//保存擴(kuò)展名
form.keepExtensions = true
//上傳文件的最大大小
form.maxFieldsSize = 20 * 1024 * 1024
form.parse(req, (err, fields, files) => {
// 項(xiàng)目未打包時使用
const imagepath = 'http://localhost:8088/' + path.normalize(files.file.path)
// 項(xiàng)目打包到server之后使用
// const imagepath = path.normalize(files.file.path)
res.status(200).send(imagepath)
// return next()
})
},
官方文檔在 這里,仔細(xì)看兩眼就會發(fā)現(xiàn)你的代碼跟它的差別。
如果好奇問題出在哪里,可以看下 formidable 的源碼,incoming_form.js。
因?yàn)槟闼械?code>parse操作都是在同一個form實(shí)例上進(jìn)行,因此,this.on('end') 會被調(diào)用多次。
end事件的回調(diào)有兩個,cb1、cb2。文件上傳成功,cb1首先被調(diào)用,然后就悲劇了IncomingForm.prototype.parse = function(req, cb) {
// 忽略一堆無關(guān)緊要的代碼....
// 注冊各種回調(diào),同樣忽略掉無關(guān)緊要的代碼
if (cb) {
this.on('end', function() {
cb(null, fields, files);
});
}北大青鳥APTECH成立于1999年。依托北京大學(xué)優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達(dá)內(nèi)教育集團(tuán)成立于2002年,是一家由留學(xué)海歸創(chuàng)辦的高端職業(yè)教育培訓(xùn)機(jī)構(gòu),是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學(xué)校辦產(chǎn)業(yè)為響應(yīng)國家深化產(chǎn)教融合/校企合作的政策,積極推進(jìn)“中國制造2025”,實(shí)現(xiàn)中華民族偉大復(fù)興的升級產(chǎn)業(yè)鏈。利用北京大學(xué)優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓(xùn)領(lǐng)域的先行者
曾工作于聯(lián)想擔(dān)任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔(dān)任項(xiàng)目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍(lán)懿科技有限責(zé)任公司從事總經(jīng)理職務(wù)負(fù)責(zé)iOS教學(xué)及管理工作。
浪潮集團(tuán)項(xiàng)目經(jīng)理。精通Java與.NET 技術(shù), 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗(yàn),技術(shù)功底深厚。 授課風(fēng)格 授課風(fēng)格清新自然、條理清晰、主次分明、重點(diǎn)難點(diǎn)突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應(yīng)用開發(fā)經(jīng)驗(yàn)。曾經(jīng)歷任德國Software AG 技術(shù)顧問,美國Dachieve 系統(tǒng)架構(gòu)師,美國AngelEngineers Inc. 系統(tǒng)架構(gòu)師。