2017-08-14 9 views
0

私は約束関数と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); 
 
     }); 
 
    }); 
 
};

+0

あなたは単に 'path.join(__ dirname、 '../assets/images/tmp'、file)'、mindを実行できます。 'throw err'があなたのサーバを強制終了することにも注意してください。私は 'fs.readFile'の有名なバージョンを使用することをお勧めします。 – Ryan

+0

@ Ryan、これはちょうどjimpがプロジェクトの要件まで守っているかどうかを確認するための予備テストです。リファクタリングがあなたの言いたいことを処理します。 –

+0

ああ、確かに、 'req.params.name'を検証せずに' path.join(...、 'tmp'、req.params.name) 'の内容を読み込んで応答しないでください。 /書き込みアクセス権(パーミッションに依存して、どちらも悪いです)を '?name = ../../sensitive-config'であなたのシステム上のファイルに追加します。私はUUIDまたはハッシュをお勧めします。 – Ryan

答えて

2

書き込み機能が完了する前に解決が呼び出されるように、書き込みは非同期関数です。コールバックを使用して順序を確認する

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)); 
    }); 
}); 
+0

いたずらに簡単な解決策。ありがとうございました! –

+0

@BrianEmiliusこれが機能する場合は、この回答を受け入れてください。そうでない場合は、別の問題が発生しているこの回答にコメントしてください。私は助けようとします。 – ZeroCho

+0

私は受け入れタイマーを待っていました;) –

関連する問題