Я использую функцию обещания и Jimp, чтобы изменить размер изображения, сохранить его в папке, а затем вернуть путь к новому изображению с измененным размером.
Однако функция resolve()
в resizeWidth()
запускается до выполнения image.resize().write()
, что означает сбой моего приложения, поскольку оно не может найти новый файл.
Любая помощь будет принята с благодарностью.
const fs = require('fs');
const path = require('path');
const jimp = require('jimp');
const resizeWidth = function(file, width) {
return new Promise((resolve, reject) => {
jimp.read(path.join(__dirname, '..', 'assets', 'images', file), (err, image) => {
if (err) reject(err);
const xSize = parseInt(width);
image.resize(xSize, jimp.AUTO)
.write(path.join(__dirname, '..', 'assets', 'images', 'tmp', file));
resolve(path.join(__dirname, '..', 'assets', 'images', 'tmp', file));
});
});
};
module.exports = function(server) {
server.get('/images/:name/:width', (req, res) => {
resizeWidth(req.params.name, req.params.width)
.then(() => {
fs.readFile(path.join(__dirname, '..', 'assets', 'images', 'tmp', req.params.name),
(err, newData) => {
if (err) throw err;
res.sendRaw(200, newData, {
'Content-Length': Buffer.byteLength(newData)
});
res.end();
});
})
.catch((err) => {
console.log(err);
});
});
};
path.join(__dirname, '../assets/images/tmp', file)
, заметьте. Также обратите внимание, чтоthrow err
убьет ваш сервер; Я бы предложил использовать обещанную версиюfs.readFile
. - person Ry-♦   schedule 14.08.2017path.join(…, 'tmp', req.params.name)
без проверки или преобразованияreq.params.name
, если только вы не хотите, чтобы клиенты имели доступ для чтения/записи (в зависимости от разрешений — оба одинаково плохи) к любому файлу в вашей системе с?name=../../sensitive-config
. Я рекомендую UUID или хэш. - person Ry-♦   schedule 14.08.2017