0

我们有一个 Web 应用程序,它在访问 url 时会准备并生成一个.zip文件,然后下载该文件。

我需要创建一个 nodejs 应用程序,使用requestjs它可以继续发出请求,直到有附件标头,从那里下载它。

生成.zip文件的页面包含一个简单的 html 消息,说明文件正在准备下载。reload(true)使用加载时调用的 javascript函数。

我不确定这是否是正确的做法,但我愿意接受建议。

4

1 回答 1

1

您可以使用async.until循环一些逻辑,直到标头可用:

let success = true;
async.until(
    // Do this as a test for each iteration
    function() {
        return success == true;
    },
    // Function to loop through
    function(callback) {
        request(..., function(err, response, body) {
            // Header test
            if(resonse.headers['Content-Disposition'] == 'attatchment;filename=...') {
                response.pipe(fs.createWriteStream('./filename.zip'));
                success = true;
            }
            // If you want to set a timeout delay
            // setTimeout(function() { callback(null) }, 3000);
            callback(null);
        });
    },
    // Success!
    function(err) {
        // Do anything after it's done
    }
)

您可以使用 setInterval 等其他方式来实现,但我会选择使用 async 来实现友好的异步功能。

编辑:这是另一个使用的示例setTimeout(我不喜欢setInterval.

let request = require('request');

let check_loop = () => {
    request('http://url-here.tld', (err, response, body) => {
        // Edit line below to look for specific header and value
        if(response.headers['{{HEADER_NAME_HERE}}'] == '{{EXPECTED_HEADER_VAL}}') 
        {
            response.pipe(fs.createWriteStream('./filename.zip')); // write file to ./filename.zip
        }
        else
        {
            // Not ready yet, try again in 30s
            setTimeout(check_loop, 30 * 1000);
        }
    });
};

check_loop();
于 2016-10-25T17:06:15.590 回答