Node.js で画像を扱う際に使える便利なミドルウェアモジュールの1つが easyimage です。内部的に ImageMagickを使うので別途導入が必要ですが、このモジュールを使うことで画像のリサイズや切り取りといった処理が簡単にできるようになります。以前にこのブログでも紹介した IBM Watson の類似画像検索サンプルの中でも使っています。


ところが、最近このモジュールを使って画像のリサイズを行っている中で不思議な挙動に遭遇することが何度かありました。現象の特徴はこんな感じでした:
  1. resize() メソッドを実行するとエラーが発生する
  2. エラーメッセージは [Error: File not supported.]
  3. このエラーが発生しても、リサイズ処理そのものは成功している
  4. 以前はこのようなエラーは発生しなかった
    • Node.js や easyimage モジュールのバージョンは以前から同じ
    • 以前は Linux で開発しており、その時はこのエラーには遭遇しなかった。このエラーが発生しているのは Windows 環境

要はリサイズ処理そのものは成功するのですが、Windows だとエラーが発生する(Linux だとしない)という、なんかややこしそうな、嫌な感じの特徴です。しかも Node.js なので非同期にこのリサイズ処理が実行されるため、
var easyimg = require( 'easyimage' );
  :

var option = { src: 'images/src.png', dst: 'images/dst.png', width: 800 };
easyimg.resize( option ).then(
  function( file ){
    :  // 成功した場合の処理
  },
  function( err ){
    :  // エラーになった場合の処理
  }
);

というコードになっています。そして Linux 環境で実行すると成功した場合の処理が行われ、Windows環境だとエラーになった場合の処理で 'File not supported' なエラーが発生するのですが、実際にはどちらもリサイズされた結果が images/dst.png に作られている、という状況になります。ややこしいでしょ?

最初は自分のコードのミスを疑っていたのですが、調べてみるとこの現象は Open Issue として公開されている(要するに障害としては認識されている)ことがわかりました:
https://github.com/hacksparrow/node-easyimage/issues/27


とはいえ、現時点で有効な修正が提供されているわけではないため、Linux でも Windows でも動くようにワークアラウンドを考える必要があります。自分の場合はシンプルに「成功したら普通に処理、エラーが発生しても無視して処理」するようにしました:
var easyimg = require( 'easyimage' );
  :

var option = { src: 'images/src.png', dst: 'images/dst.png', width: 800 };
easyimg.resize( option ).then(
  function( file ){
    :  // 成功した場合の処理
  },
  function( err ){
    :  // エラーになった場合
 (エラーを無視して成功した場合と同じ処理を実行)
  }
);

もう少し便利な方法ないかなと思いつつ、早くこの障害が直ることを期待しつつ、とりあえずこの方法で回避しています。