簡體   English   中英

Node.js + request - 保存遠程文件並在響應中提供

[英]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');
    });
})

由於請求將返回可讀流,我們可以監聽其dataend事件以寫入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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM