从 nodeJs 请求字体真棒文件发回错误 data/file
Requesting font awesome file from nodeJs is sending back wrong data/file
我的应用程序:当您从浏览器向我的节点服务器发送请求时,我的节点服务器将请求一个原始网站,下载其所有静态文件(包括代码)并将它们返回给用户。下次您访问我的节点服务器时,它将从节点返回所有内容,而不是请求来源。
当我从节点
请求字体真棒文件时
http://example.com/modules/megamenu/fonts/fontawesome-webfont.woff?v=4.2.0
文件内容与我使用 cUrl 请求相同 url 时不同。
当我 return 从节点返回浏览器的文件时,这会导致浏览器出现此错误:
Failed to decode downloaded font: http://nodeDomain.test/modules/megamenu/fonts/fontawesome-webfont.woff?v=4.2.0
如果我将通过 curl 请求的文件中的内容复制并粘贴到存储在我的节点服务器上的文件中,错误就会消失,所有很棒的字体都能正常工作。
这是 headers 我从节点发送到原始服务器的请求。
{
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 请求时发送的 headers 内容,但我不知道该怎么做。
______Node 用于获取 file_______
的代码
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)}
});
}
我认为您的代码存在问题,因为您正在将缓冲区输出转换为 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
});
我的应用程序:当您从浏览器向我的节点服务器发送请求时,我的节点服务器将请求一个原始网站,下载其所有静态文件(包括代码)并将它们返回给用户。下次您访问我的节点服务器时,它将从节点返回所有内容,而不是请求来源。
当我从节点
请求字体真棒文件时http://example.com/modules/megamenu/fonts/fontawesome-webfont.woff?v=4.2.0
文件内容与我使用 cUrl 请求相同 url 时不同。
当我 return 从节点返回浏览器的文件时,这会导致浏览器出现此错误:
Failed to decode downloaded font: http://nodeDomain.test/modules/megamenu/fonts/fontawesome-webfont.woff?v=4.2.0
如果我将通过 curl 请求的文件中的内容复制并粘贴到存储在我的节点服务器上的文件中,错误就会消失,所有很棒的字体都能正常工作。
这是 headers 我从节点发送到原始服务器的请求。
{
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 请求时发送的 headers 内容,但我不知道该怎么做。
______Node 用于获取 file_______
的代码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)}
});
}
我认为您的代码存在问题,因为您正在将缓冲区输出转换为 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
});