私は約束関数とJimpを使用してイメージのサイズを変更し、フォルダに保存してから、新しいサイズ変更イメージにパスを返します。Nodejs:タスクが完了する前に火災を解決する約束
image.resize().write()
が実行される前にresizeWidth()
のresolve()
の機能が実行されます。これは、新しいファイルが見つからないため、アプリケーションがクラッシュすることを意味します。
ご協力いただければ幸いです。
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)'、mindを実行できます。 'throw err'があなたのサーバを強制終了することにも注意してください。私は 'fs.readFile'の有名なバージョンを使用することをお勧めします。 – Ryan
@ Ryan、これはちょうどjimpがプロジェクトの要件まで守っているかどうかを確認するための予備テストです。リファクタリングがあなたの言いたいことを処理します。 –
ああ、確かに、 'req.params.name'を検証せずに' path.join(...、 'tmp'、req.params.name) 'の内容を読み込んで応答しないでください。 /書き込みアクセス権(パーミッションに依存して、どちらも悪いです)を '?name = ../../sensitive-config'であなたのシステム上のファイルに追加します。私はUUIDまたはハッシュをお勧めします。 – Ryan