无法使用 nodejs 获取、写入和读取字体文件

Not able to fetch, write and read a font file using nodejs

问题:

使用request模块下载并写入文件系统的文件与使用浏览器直接下载的文件不同

我正在获取位于 https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff 的字体文件。有以下3种情况

案例一

现在正常情况下,网站 运行 从其源代码中获取此 URL,以下是响应 [在开发者工具中检查过]

d09GRgABAAAAAPqMABMAAAACNCgAAQAyAAAAAAAAAAAAAAAAAAAAAAAAAABCQVN....

当我使用我的 nodejs 脚本获取它时,我得到了响应

wOFF....??....4(...2....

以上是我在浏览器的开发者工具网络选项卡中看到的响应。

案例二

但是当我 运行 两个 url,即原始 url 和我自己的 http://<host>/_oe/https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff,在 Postman 中,我得到相同的响应。

案例三

然后再次在浏览器中复制和粘贴 https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff 时,下载的文件显示为

774f 4646 0001 0000 0000 c7f4 000b 0000 0000 c7a8 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 4f53 2f32

并且使用我的 nodejs 脚本编写的文件读起来像

774f 4646 0001 0000 0000 efbf bdef bfbd 000b 0000 0000 c7a8 0001 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

两者又不同了。

问题

我的问题是,谁能解释一下这是怎么回事,我做错了什么,我该怎么做才能获得正确编码的正确字体文件,以便在前端正确使用它。

Nodejs 脚本 : 这是我的 nodejs

代码
app.get('/*', (req, res) => {
    var extension = '.woff';
    var options         = {
        headers: {
            'connection': 'keep-alive',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
            'Accept-Language': 'en-US,en;q=0.5'
        },
        url: 'https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff'
    };

    sendRequest(options, extension, function(headers){

        //setting response headers
        var header_ = {};
        for(var attribute in  headers){
            if(attribute !== 'content-length'){
                header_[attribute] = headers[attribute];
            }
        }

        //#================================================================
        res.writeHead(200, header_);
        var filePath = path.join(__dirname, 'output/temp'+extension);
            var stat = fileSystem.statSync(filePath);
            var readStream = fileSystem.createReadStream(filePath);
            //read from `readStream` write to `res`
            readStream.pipe(res);
        //#================================================================

    });

})

async function sendRequest(options, extension, callback){
    var headers;
    request(options, function(error, response, body){
        if (!error && response.statusCode == 200) {
            headers = response.headers;

            if (String(response.headers['content-type']).indexOf('text/html') !== -1){
                // any manipulation related to the html file                
            }else {
                // where I get my font url response
                fileSystem.writeFile(path.join(__dirname, 'output/temp'+extension), body, function(err) {
                    if(err) {
                        return console.log(err);
                    }
                    callback(headers);
                }); 
            }
        }
    });
}

app.listen(3000, () => console.log('Example app listening on port 3000!'));

更新

我什至在写入文件时使用了 "binary" 选项,即

fileSystem.writeFile(path.join(__dirname, 'output/temp'+extension), body, "binary", function(err) {})

现在在控制台上我得到了所需格式的数据 d09GRgABAAAAAP39AAs...

但仍然与我从原始网站获得的信息不同,即 d09GRgABAAAAAPqMABMAAAACNC...

要获取响应的原始缓冲区,您需要将 encoding 设置为 null

var options = {
    url: 'https://assets.ajio.com/static/assets/ec86819f634b9e9979b83bae65b170dd.woff',
    encoding : null
};

如果您随后将其写入文件:

request(options, function(error, response, body) {
    fs.writeFile('test.woff', body, function(err) {

    })
})

那么这将等于您请求的那个。