[英]Node.js + request - saving a remote file and serving it in a response
我理解如何使用Node.js +請求加載遠程文件,然后我可以讀取它並返回png二進制blob。 有一個優雅的方式來做一個請求(甚至一個班輪)
就像是:
http.createServer(function(req, res) {
res.writeHead(200, {
'Content-Type': 'image/png'
});
var picWrite = fs.createWriteStream(local);
var picFetch = fs.createReadStream(local);
picStream.on('close', function() {
console.log("file loaded");
});
request(remote).pipe(picWrite).pipe(picFetch).pipe(res);
})
要明確:我的目標是從CDN加載遠程文件,將其本地緩存到服務器,然后在原始請求中返回該文件。 在將來的請求中,我使用fs.exists()
來檢查它是否存在。
到目前為止,這是我的最大努力:
http.createServer(function(req, res) {
var file = fs.createWriteStream(local);
request.get(remote).pipe(file).on('close', function() {
res.end(fs.readFileSync(local), 'binary');
});
})
由於請求將返回可讀流,我們可以監聽其data
和end
事件以寫入HTTP響應和可寫流。
var http = require('http');
var request = require('request');
http.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'image/png' });
var file = fs.createWriteStream(local);
// request the file from a remote server
var rem = request(remote);
rem.on('data', function(chunk) {
// instead of loading the file into memory
// after the download, we can just pipe
// the data as it's being downloaded
file.write(chunk);
res.write(chunk);
});
rem.on('end', function() {
res.end();
});
});
您顯示的方法首先將數據寫入磁盤,然后再次將其讀入內存。 這是毫無意義的,因為數據在寫入磁盤時已經可以訪問。
如果使用事件處理程序,則可以同時寫入HTTP響應和文件流,而無需再次無意義地將文件加載到內存中。 這也解決了使用pipe()
的問題,因為pipe()
將使用可讀流中的數據,並且只能執行一次。
這也解決了內存不足的問題,因為如果你要下載一個大文件,那么它會有效地運行你的Node.js進程內存不足。 使用流,一次只將文件的塊加載到內存中,因此您沒有此問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.