2017-06-08 7 views
-1

私の約束がnode.js Webアプリケーションでどのように働いているか混乱しています。Node JSアプリケーションで期待どおりに動作しない約束

基本的に私の最初の約束は、pdfとtiffファイルドキュメントをtempフォルダ内の別のpngファイルに変換するスクリプトを実行していることです。次に、2番目の約束は、pngを基底64に変換して動的配列に格納するスクリプトを実行します。私はこのようなものとして出力を得る約束消費した場合:

{ title: '' } 
{ fieldname: 'upl', 
    originalname: 'multipage_tiff_example.tif', 
    encoding: '7bit', 
    mimetype: 'image/tiff', 
    destination: 'uploads/', 
    filename: 'multipage_tiff_example.tif', 
    path: 'uploads\\multipage_tiff_example.tif', 
    size: 810405 } 
Finished Conversion and Encoding to Base 64! 
undefined 
POST/302 181.742 ms - 60 
GET /ViewDoc 304 8.564 ms - - 
Converted! 

を我々は(arrayPicsは、[4])出力は未定義として出ているにconsole.logことがわかります。しかし、コードをデバッグしているときに同じコードを実行すると、次のような結果が得られます。

Debugger listening on [::]:54395 
Server is listening on: 3000 
GET/304 35.525 ms - - 
{ title: '' } 
{ fieldname: 'upl', 
    originalname: 'multipage_tiff_example.tif', 
    encoding: '7bit', 
    mimetype: 'image/tiff', 
    destination: 'uploads/', 
    filename: 'multipage_tiff_example.tif', 
    path: 'uploads\\multipage_tiff_example.tif', 
    size: 810405 } 
Finished Conversion and Encoding to Base 64! 
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAJYCAIAAAAVFBUnAAAABGdBTUEAAL....... 
Converted! 

ここで、console.log(arrayPics [4])の出力が得られることがわかります。これは、なぜ私のコードがそのように動作しているのか混乱している部分です。私ができる場合、私は感謝される

module.exports = { 

    convert: function pdfConverter(req) 
    { let check = true; 
     gm(req.file.path).write('Images/output.png', (err)=> 
     { 
      if(err) 
      { 
       console.log(err); 
       reject(err); 
       check = false; 
      } 

      else 
      { 
       console.log("Converted!"); 

      } 

     }); 
     return check; 
    } 

}; 

base64エンコード

module.exports = { 
    encoder: function base64_encoder(arrayPics) 
      { 
       let files = fs.readdirSync('Images/'); 
       for(let i in files) 
       { 
        //console.log('C'); 
        arrayPics.push(base64Img.base64Sync('Images/output-' + i + ".png")); 
       } 
       return true; 
      } 
}; 

ドキュメントコンバータのSCRIPT:私はまた私の約束はあなたの参照のために使用している私のスクリプトを掲載していますなぜこれが起こっているのか、自分のコードに加えることができる変更についていくつかの提案を得てください。

+0

'new'プロンプトを' convert'関数内に置く必要があります – Bergi

答えて

1

問題はドキュメントコンバータスクリプトにあります。 .write()メソッドにコールバック関数を渡します。つまり、非同期ですが、convert()関数が同期して戻ります。コールバックでfalseに設定される前にすぐにcheckを返します。

convert()関数は、.write()メソッドに渡すコールバックで解決または拒否するPromiseを返すようにする必要があります。

は、その後、あなたのアプリケーションのスクリプトの中で、あなたのconv()関数宣言はこのように単純化することができます。let conv =() => converter.convert(req);

また、それはあなたのエンコーダが非同期ではありません立っているので、Promiseでそれを包むにはポイントがありませんよう。
.readdirSync()の代わりに.readdir()を使用するなど、非同期にすることもできます。それを行うと、あなたのコンバーターについて説明したのと同じことがエンコーダーに適用されます。

+0

ありがとう!それは助けになった! – Vmal

関連する問題