2016-05-17 4 views
0

Когда файл является 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.

ответ

0

Видимо он начал писать JPG уже и BMP только тогда, когда это будет сделано, я решил его с помощью обратного вызова меняющийся код на:

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); 

      return new Promise(function(resolve, reject) { 
       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, function(err) { 
         if(err) { 
          return reject(err); 
         } 

         return resolve(fullDestinationPath); 
        }); 
      }); 
     }) 
     .catch(function (err) { 
      console.error(err); 
     }); 
}; 

Проблема заключалась в том, что picture.resize не возвращал обещание поэтому он продолжался, не дожидаясь .write.

Смежные вопросы