Ошибка при синхронной записи с использованием 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
это класс, который я определил как:
function ReceivedMedia(media) {
this.b64 = media.b64;
this.extension = media.extension;
this.posx = media.posx;
this.posy = media.posy;
}
Дополнительный вопрос: если я использую writeFile
вместо writeFileSync
одно из моих изображений повреждено, а другое не содержит данных. Если после этого я снова запускаю скрипт узла, файлы сохраняются правильно. Я также хотел бы получить некоторые объяснения относительно того, почему это происходит, из моего понимания одно из них является синхронным (writeFileSync
Я догадываюсь) а другой асинхронный (writeFile
Я предполагаю).
1 ответ
Поиск в Google по вашему описанию сообщения об ошибке нашел это обсуждение проблемы в io.js и это обсуждение в node.js, и похоже, что это исправленная ошибка (не уверен, что исправление было выпущено в полной сборке). еще).
Исправление node.js здесь.
Если бы вы сейчас не могли исправить это в своей собственной сборке, вам пришлось бы применить это исправление к вашему собственному дереву кода и перестроить его. В противном случае вам придется изучить или узнать, когда это исправление попадет в официальный релиз (лично я не уверен, как этот процесс работает для node.js).