Сохраненное изображение недоступно. Как будто запрос разрешается до его завершения
Пользователь выбирает изображение (в данном случае из Facebook, но я не думаю, что это имеет отношение к проблеме). Запрос отправляется на сервер, чтобы получить изображение и сохранить его локально. Запрос обрабатывается с помощью 200. Разрешенный запрос принимается на клиенте, и изображение динамически добавляется на страницу с помощью JS путем создания нового образа.
Проблема: несмотря на то, что запрос не разрешается до тех пор, пока не завершится процесс записи, когда клиент пытается загрузить изображение, он возвращает 404.
Я попытался добавить обработчик ошибок на клиенте, который перезагружает изображение, если оно возвращается с 404. Это работает через несколько сотен миллисекунд. Однако есть еще одна проблема. Часто изображение загружено только наполовину, а остальное - черное.
Как будто изображение не завершило обработку, когда запрос разрешается.
Я понятия не имею, что является причиной проблемы. Я не вижу, как запрос может быть обработан до завершения операции.
import fs from 'fs';
import request from 'request';
import gm from 'gm';
import createUserImageFolders from './imageHelpers/createUserImageFolders';
import getNextImageNumber from './imageHelpers/getNextImageNumber';
import saveImages from './imageHelpers/saveImages';
export default function uploadFacebookPhoto(req, params) {
return new Promise((resolve, reject) => {
createUserImageFolders(req.session.currentDesignerSessionId);
const userDir = 'static/images/user/' + req.session.currentDesignerSessionId;
const imageNumber = getNextImageNumber(userDir + '/uploads/full');
const filename = `${userDir}/uploads/full/${imageNumber}.jpg`;
const thumbWidth = 100;
// Stream the image from the remote server.
request.head(req.body.photoUrl, (err, response, body) => {
request(req.body.photoUrl).pipe(fs.createWriteStream(filename).on(
'close',
() => {
// Create thumbnail
gm(filename)
.noProfile()
.quality(85)
.resize(thumbWidth)
.write(userDir + `/uploads/thumb/${imageNumber}.jpg`, (error) => {
if (error) {
console.error('Graphics Magic (gm) error ', error);
reject({error: 500});
} else {
resolve(true);
}
});
}
));
});
});
}