使用 Node.js 进行同步写入时出错

Error during synchronous write using Node.js

我编写了代码来解析从 Firebase 返回的字典,其中包含使用 base64 编码的图像。我希望它将这些图像简单地写入文件,它确实如此,但在我完成写入后收到以下错误:

smalloc.cc:280: void node::smalloc::SliceOnto(const v8::FunctionCallbackInfo<v8::Value>&): Assertion `end <= source_len' failed.

这是我的代码:

    // Iterate through each key in each page if each request
for (var key in request) {

    var obj = request[key];

    if (typeof (obj) == "object") {

        for (var prop in obj) {

            item++;
            if(obj.hasOwnProperty(prop)) {

                switch (prop) {

                    case "img":

                        var media = new ReceivedMedia(obj[prop]);

                        var filename = transaction.tid + "-" + item + "." + media.extension;
                        filename = filename.slice(10);
                        require('fs').writeFileSync(filename, media.b64, 'base64', function(err) {
                            if (err) throw err;
                        });
                        break;
                }
            }
        }
    }
}

我的图像输出正常,但错误有点奇怪,我希望不要发生。有人知道为什么会这样吗?那将非常有帮助:)

注:ReceivedMedia是一个class我定义为:

function ReceivedMedia(media) {
    this.b64 = media.b64;
    this.extension = media.extension;
    this.posx = media.posx;
    this.posy = media.posy;
}

附带问题:如果我使用 writeFile 而不是 writeFileSync,我的一张图片已损坏,另一张不包含任何数据。如果在那之后我再次 运行 我的节点脚本,文件会正确保存。我还想解释为什么会发生这种情况,根据我的理解,其中一个是同步的(writeFileSync 我猜),另一个是异步的(writeFile 我假设)。

Google 搜索您的错误消息描述,发现 this discussion of the issue in io.js and this discussion in node.js 听起来这是一个已修复的错误(不确定修复是否已在完整版本中发布) .

node.js 修复是 here

如果您现在迫切希望在自己的构建中修复它,则必须将修复应用到您自己的代码树并重建它。否则,您将不得不调查或询问此修复程序何时会进入正式版本(我个人不确定该过程如何适用于 node.js)。