Когда файл является JPG, он создается до того, как возвращается ответ (для отображения измененного изображения в браузере). Но когда это PNG возвращается, прежде чем он написал PNG в результате аварии на сервере Node.js, потому что он не может создать ReadStream для чего-то, что не существует:Обещанное слишком рано
Resizer вызов
else {
resizer
.resizeHandler(filepath, parsedUrl, fullDestinationPath)
.then(function() {
return self.send(response, 200, {'Content-Type': mime.lookup(fullDestinationPath)}, fs.createReadStream(fullDestinationPath));
});
}
Изменение размера
Resizer.prototype.resizeThenCrop = function(filepath, parsedUrl, fullDestinationPath){
return Jimp.read(filepath)
.then(function (picture) {
var cropWidth = parsedUrl.query.w,
cropHeight = parsedUrl.query.h;
calculate(picture, parsedUrl);
picture.resize(parseInt(parsedUrl.query.w), parseInt(parsedUrl.query.h))
.crop(parseInt((parsedUrl.query.w - cropWidth)/2), parseInt((parsedUrl.query.h - cropHeight)/2), parseInt(cropWidth), parseInt(cropHeight))
.quality(parseInt(parsedUrl.query.quality))
.write(fullDestinationPath)
})
.catch(function (err) {
console.error(err);
});
};
Отправить
Router.prototype.send = function (response, code, headers, data) {
response.statusCode = code;
if (headers) {
for (var index in headers) {
if (headers.hasOwnProperty(index)) {
response.setHeader(index, headers[index]);
}
}
}
if (data instanceof Stream) {
data.pipe(response);
} else {
response.end(data);
}
};
Но может быть, он не может обрабатывать PNG или у него есть ошибка, пытающаяся изменить его размер? Я проверил и подтвердил, что это не так, просто изменив код на это:
else {
resizer
.resizeHandler(filepath, parsedUrl, fullDestinationPath)
.then(function() {
//return self.send(response, 200, {'Content-Type': mime.lookup(fullDestinationPath)}, fs.createReadStream(fullDestinationPath));
});
}
Теперь ничего не возвращает, и мой браузер будет ждать вечно, так как он не дает ответ обратно. Но он создает файл в папке, как в случае с JPG, что означает, что он работает. Когда createReadStream вызывается до фактического создания файла с измененным размером, он приводит к сбою, потому что файл не существует. Файл также не создается, потому что сервер, создающий его, остановился. Ошибка:
Error: ENOENT: no such file or directory, open '/var/www/pngbla_w512_h53_q80.png'
at Error (native)
Что я могу сделать, чтобы он работал правильно для моего PNG? И почему он не работает для моих файлов PNG, даже если для некоторых файлов JPG требуется 20 секунд, потому что он изменен до большого разрешения.
EDIT: Я пробовал для нескольких размеров, даже если размер будет почти мгновенным ~ 5 мс, ответ по-прежнему будет вызван раньше с помощью PNG.