无法使用nodejs

时间:2018-06-19 05:41:36

标签: javascript node.js fs nodejs-stream

问题

使用请求模块下载的文件,并将其写入文件系统与使用浏览器直接下载的文件不同

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

案例1

现在,当网站通常从其源代码运行此URL时,以下是响应[在deveoper工具中检查]

  

... d09GRgABAAAAAPqMABMAAAACNCgAAQAyAAAAAAAAAAAAAAAAAAAAAAAAAABCQVN

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

  

... WOFF ?? .... 4(... 2 ...

以上是我在浏览器的开发人员工具网络选项卡中看到的回复。

案例2

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

案例3

然后在复制并粘贴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!'));

更新

我在编写文件时甚至使用了“二进制”选项,即

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

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

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

1 个答案:

答案 0 :(得分:2)

要获取响应的原始缓冲区,您需要将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) {

    })
})

然后这将是你要求的那个。