http.request 發(fā)送服務請求
http.request返回一個可寫流http.ClientRequest ,可以調(diào)用 req.write()發(fā)送到服務端,如果發(fā)送到是一個文件流,則需要設置文件頭'Connection': 'keep-alive'保持長鏈接,否則就只觸發(fā)一次data事件,只鏈接一次也是短鏈接到特性,'Connection': 'keep-alive'為http1.0標準,在實際開發(fā)中就碰到這樣一個問題,因為未設置keep-alive 服務端data只觸發(fā)了一次,而在fs.createReadStream中data事件里req.write第二次時報錯,因為如果不設置保持鏈接則默認為短鏈接,調(diào)用一次write后服務會自動調(diào)用end來關閉鏈接。
let option ={
host:"127.0.0.1", //請求host
path:"/uploadFile", //請求鏈接
port:3000, //端口
method:"POST", //請求類型
headers:{。 //請求頭
'Content-Type': 'application/octet-stream', //數(shù)據(jù)格式為二進制數(shù)據(jù)流
'Transfer-Encoding': 'chunked', //傳輸方式為分片傳輸
'Connection': 'keep-alive'。 //這個比較重要為保持鏈接。
}
}
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ā)送結束
})
服務端接收
ctx.req 拿到nodejs原始request值,因為reqeust被發(fā)送時是一個stream可讀流,所以可用data事件去監(jiān)聽。
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();
}))