http.request 發(fā)送服務(wù)請(qǐng)求
http.request返回一個(gè)可寫(xiě)流http.ClientRequest 副签,可以調(diào)用 req.write()發(fā)送到服務(wù)端妨托,如果發(fā)送到是一個(gè)文件流,則需要設(shè)置文件頭'Connection': 'keep-alive'保持長(zhǎng)鏈接意系,否則就只觸發(fā)一次data事件,只鏈接一次也是短鏈接到特性,'Connection': 'keep-alive'為http1.0標(biāo)準(zhǔn)腾仅,在實(shí)際開(kāi)發(fā)中就碰到這樣一個(gè)問(wèn)題,因?yàn)槲丛O(shè)置keep-alive 服務(wù)端data只觸發(fā)了一次套利,而在fs.createReadStream中data事件里req.write第二次時(shí)報(bào)錯(cuò)推励,因?yàn)槿绻辉O(shè)置保持鏈接則默認(rèn)為短鏈接,調(diào)用一次write后服務(wù)會(huì)自動(dòng)調(diào)用end來(lái)關(guān)閉鏈接肉迫。
let option ={
host:"127.0.0.1", //請(qǐng)求host
path:"/uploadFile", //請(qǐng)求鏈接
port:3000, //端口
method:"POST", //請(qǐng)求類型
headers:{验辞。 //請(qǐng)求頭
'Content-Type': 'application/octet-stream', //數(shù)據(jù)格式為二進(jìn)制數(shù)據(jù)流
'Transfer-Encoding': 'chunked', //傳輸方式為分片傳輸
'Connection': 'keep-alive'。 //這個(gè)比較重要為保持鏈接喊衫。
}
}
let req = http.request(option);
fs.createReadStream(path.join(__dirname,"line.png"))
.on("open",chunk=>{
})
.on("data",chunk=>{
req.write(chunk); //發(fā)送數(shù)據(jù)
})
.on("end",()=>{
req.end(); //發(fā)送結(jié)束
})
服務(wù)端接收
ctx.req 拿到nodejs原始request值跌造,因?yàn)閞eqeust被發(fā)送時(shí)是一個(gè)stream可讀流,所以可用data事件去監(jiān)聽(tīng)族购。
app.use(router.post("/uploadFile",(ctx,next)=>{
//let data = fs.createReadStream(ctx)
//ctx.req.setEncoding="binary";
let url=path.join(__dirname,"/test/");
let file = path.join(url,"node.tar.gz")
let chunks='';
ctx.req.on("data",function(d){
let da = d.toString("utf8")
debugger
}).on("close",function(e){
debugger
}).on("error",function(){
debugger
}).on("end",function(){
debugger
})
next();
}))