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

标签 javascript node.js fs nodejs-stream

问题:

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

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

案例一

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

d09GRgABAAAAAPqMABMAAAACNCgAAQAyAAAAAAAAAAAAAAAAAAAAAAAAAABCQVN....

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

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

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

案例二

但是当我同时运行两个网址时,即原始网址和我自己的网址 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!'));

更新

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

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) {

    })
})

然后这将等于您请求的那个。

关于javascript - 无法使用 nodejs 获取、写入和读取字体文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50921300/

相关文章:

javascript - MVC 从局部 View 调用函数不起作用

javascript - Nodejs异步任务和匿名函数

javascript - 优化node.js中显示mysql查询结果的效率

angular - Angular&Electron-在默认浏览器中打开链接

node.js - Node.js>在将数据写入文件的同时以只读模式打开.csv文件

javascript - 文件系统 Nodejs : "Uncaught TypeError: fs.writeFileSync is not a function"

javascript - JS 切换类

javascript - 从回调返回值

javascript - 我如何居中 Bootstrap 的轮播?不是图片,是轮播本身

node.js - 是否可以在React App路径下托管Wordpress博客