我的应用程序:当您从浏览器向我的节点服务器发送请求时,我的节点服务器将请求原始网站,下载其所有静态文件(包括代码)并将其服务回给用户。下次访问我的节点服务器时,它将从节点返回所有内容,而不是请求源。
当我从节点
请求字体真棒文件时http://example.com/modules/megamenu/fonts/fontawesome-webfont.woff?v=4.2.0
该文件的内容与我使用cUrl请求相同网址时的内容不同。
当我将文件从节点返回到浏览器时,这会在浏览器中导致此错误:
Failed to decode downloaded font: http://nodeDomain.test/modules/megamenu/fonts/fontawesome-webfont.woff?v=4.2.0
如果我将我通过curl请求的文件中的内容复制并粘贴到我的节点服务器上存储的文件中,则错误消失,所有字体都很棒。
以下是我从节点发送请求到源服务器的标头。
{
connection: 'keep-alive',
pragma: 'no-cache',
'cache-control': 'no-cache',
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36',
accept: '*/*',
referer: 'http://example.com/modules/megamenu/css/font-awesome.min.css',
'accept-language': 'en-US,en;q=0.8',
cookie: 'PrestaShop-a30a9934ef476d11b.....'
}
我试图查看从命令行执行curl请求时发送的头文件,但我无法弄清楚如何操作。
______用于获取文件的节点代码_______
Url: in options is the one stated above
headers: are the browsers request headers
var options = {
url: originRequestPath,
headers: requestHeaders
}
var originPage = rquest(options);
var responseBody = '';
var resHeads = '';
originPage.on('response', function(res)
{
//store response headers locally
}
originPage.on('data', function(chunk)
{
responseBody += chunk;
});
originPage.on('end', function()
{
storeData.storePageData(storeFilePath, responseBody);
});
__________Store Function below________________
exp.storePageData = function(storePath, pageContent)
{
fs.outputFile(storePath, pageContent, function(err) {
if(err){ console.log(err)}
});
}
答案 0 :(得分:2)
我相信您的代码的问题是您正在将缓冲区输出转换为utf8字符串。因为您正在添加空字符串responseBody += chunk;
的缓冲区,缓冲区将转换为utf-8字符串。因此,您丢失了二进制文件的一些数据。试试这个:
var originPage = rquest(options);
var chunks = []
originPage.on('response', function(res)
{
//store response headers locally
}
originPage.on('data', function(chunk)
{
chunks.push(chunk)
});
originPage.on('end', function()
{
var data = Buffer.concat(chunks)
//send data to browser and store content locally
});