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

时间:2015-03-09 02:46:29

标签: javascript node.js asynchronous base64 synchronous

我编写的代码解析从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是我定义为的类:

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

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

1 个答案:

答案 0 :(得分:1)

Google搜索您的错误消息说明this discussion of the issue in io.jsthis discussion in node.js,这听起来像是一个已修复的错误(不确定修补程序是否已在完整版本中发布) 。

node.js修复程序为here

如果您现在已经在自己的版本中彻底修复它,那么您必须将修复程序应用于您自己的代码树并重建它。否则,您将不得不调查或询问此修复程序何时进入正式版本(我个人不确定该过程对node.js的作用)。