我们有一个 Web 应用程序,它在访问 url 时会准备并生成一个.zip
文件,然后下载该文件。
我需要创建一个 nodejs 应用程序,使用requestjs
它可以继续发出请求,直到有附件标头,从那里下载它。
生成.zip
文件的页面包含一个简单的 html 消息,说明文件正在准备下载。reload(true)
使用加载时调用的 javascript函数。
我不确定这是否是正确的做法,但我愿意接受建议。
我们有一个 Web 应用程序,它在访问 url 时会准备并生成一个.zip
文件,然后下载该文件。
我需要创建一个 nodejs 应用程序,使用requestjs
它可以继续发出请求,直到有附件标头,从那里下载它。
生成.zip
文件的页面包含一个简单的 html 消息,说明文件正在准备下载。reload(true)
使用加载时调用的 javascript函数。
我不确定这是否是正确的做法,但我愿意接受建议。
您可以使用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();