readFile每次返回不同的Buffer值

readFile returning different Buffer value every time

本文关键字:Buffer 返回 readFile      更新时间:2023-09-26

我的应用程序从Highcharts生成缩略图以显示在UI上。每次刷新页面时,缩略图的顺序都会发生变化。

经过一些调查,我发现data每次都是不同的缓冲区值(甚至在我将其传递到base64转换函数之前),这也导致我的fileImageArray每次都处于不同的顺序。

我每次都将正确的files[i]传递给readFile,所以这不是错误。

这是我读取文件的功能:

function getFiles(callback) {
    var filesNameArray = [], fileImageArray = [], base64 = "";
    fs.readdir(graphDir, function(err, files) {
        if (err) {
            console.log(err);
        } else {
            for (var i in files) {
                filesNameArray.push(files[i].substr(0, files[i].indexOf(".")));
                fs.readFile(graphDir + files[i], function(err, data) {
                    if (err) {
                        console.log(err);
                    } else {
                        base64 = 'data:image/png;base64,' + conversions.bufferToBase64(data);
                        fileImageArray.push(base64);
                    }
                });
            }
            callback(filesNameArray, fileImageArray);
        }
    });
}

感谢您的帮助。

这看起来是节点的fs实现的已知问题。https://github.com/nodejs/node/issues/3232

如果你能负担得起阻塞IO,我建议你试试fs.readdirSync。或者像这样对回调中的文件数组进行排序。

fs.readdir(graphDir, function(err, files) {
    if (err) {
        console.log(err);
    } else {
        // sort files
        files = files.sort(function(a, b) {
            return a < b ? -1 : 1;
        });
        for (var i in files) {
            filesNameArray.push(files[i].substr(0, files[i].indexOf(".")));
            fs.readFile(graphDir + files[i], function(err, data) {
                if (err) {
                    console.log(err);
                } else {
                    base64 = 'data:image/png;base64,' + conversions.bufferToBase64(data);
                    fileImageArray.push(base64);
                }
            });
        }
        callback(filesNameArray, fileImageArray);
    }
});

我还建议您将for循环切换到.forEach以优化行为。