【发布时间】:2015-03-09 02:46:28
【问题描述】:
我编写了代码来解析从 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)。
【问题讨论】:
-
V8 引擎的本机代码中的错误来自:github.com/joyent/node/blob/master/src/smalloc.cc#L280。这是某种内部数组操作的越界参数。
-
我认为我无法解决此问题,还是需要编辑 smalloc.cc?
标签: javascript node.js asynchronous base64 synchronous