5

次のサンプル ノード アプリケーションを Azure Web サイトにデプロイしようとしています。

var http = require('http');
var port = process.env.port || 1337;

http.createServer(function (req, res) {
    res.writeHead(200, { 'Content-Type': 'text/html' });

    try {

        var canvasModule = require('canvas'), 
            canvas = new canvasModule(200, 200), 
            ctx = canvas.getContext('2d');

        ctx.rotate(0.5);

        ctx.font = '30px Impact';
        var message = "Hello World";
        ctx.fillText(message, 40, 40);

        ctx.strokeRect(30, 5, 160, 50);

        res.end('<html><img src="' + canvas.toDataURL() + '" /></html>');

    } catch (e) {
        res.end('Error: ' + e);
    }

}).listen(port);

注意が必要なのは、インストール時に node-gyp を使用してコンパイルする必要がある「 canvas 」というノード モジュールを使用していることです。

このMicrosoft ページによると、ネイティブ モジュールは Azure Web サイトではサポートされていません。アプリが正しく動作するには、モジュールのコンパイル済みバージョンを Azure にコピーする必要があります。

ネイティブ モジュール

ほとんどのモジュールはプレーンテキストの JavaScript ファイルですが、一部のモジュールはプラットフォーム固有のバイナリ イメージです。これらのモジュールは、通常は Python と node-gyp を使用して、インストール時にコンパイルされます。Azure Web サイトの特定の制限の 1 つは、package.json または npm-shrinkwrap.json ファイルで指定されたモジュールをインストールする方法をネイティブに理解しますが、Python または node-gyp を提供せず、ネイティブ モジュールをビルドできないことです。

Azure Cloud Services は、アプリケーションの一部としてデプロイされる node_modules フォルダーに依存しているため、インストールされたモジュールの一部として含まれるネイティブ モジュールは、Windows 開発システムにインストールおよびコンパイルされている限り、クラウド サービスで動作するはずです。

ネイティブ モジュールは、Azure Web サイトではサポートされていません。JSDOM や MongoDB などの一部のモジュールには、オプションのネイティブ依存関係があり、Azure Web サイトでホストされているアプリケーションと連携します。

(発行ウィザードを使用して) すべてを Azure にデプロイし、コンパイルされたモジュールを含むすべてのファイルが (少なくとも) Azure に送信されました。Azure でサイトを実行すると、次の例外が発生します。

Error: The specified module could not be found.
D:\home\site\wwwroot\node_modules\canvas\build\Release\canvas.node

しかし、そのファイルは実際にはサーバーにデプロイされています。

フォルダ上のファイル

VM を作成することは明らかにオプションですが、私は Web サイトを使用することを好みます。誰でも試してみることができますか?

4

3 に答える 3

5

「指定されたモジュールが見つかりませんでした」というエラー メッセージは少し誤解を招きます。これは、1 つ以上の依存 dll が見つからないことを意味する場合があります。

Windowsでビルド命令を使用したと仮定しました。手順で GTK2 zip ファイルに対してキャンバスをビルドした場合は、%GTKDIR%\bin\freetype6.dll を %YourApp%\node_modules\canvas\build\Release にコピーできます。この dll は、ビルド プロセス中にコピーされません。VM へのデプロイも行う必要があります。または、 Windows GTK3 バンドルに対してキャンバスを構築できます。

残念ながら、すべての dll を取得した後でも、Azure Websites のサンドボックスがキャンバスの実行を妨げているようです。うまくいけば、近い将来に有効になるでしょう。

于 2014-08-06T01:02:40.443 に答える
2

今日はこれでうまくいきました!

ディレクトリを展開する必要がnode_modulesあることに加えて、すべてのコンテンツgtk/binをアプリケーションのルートにコピーする必要があるため、少し面倒ですが、機能します。パスを変更して別の場所を見ることができると思いますが、アプリを実行する必要があったため、これ以上調査しませんでした。

于 2014-10-23T19:29:47.237 に答える
0

@mtian の回答の最後の行が重要です。デプロイに時間を費やすことはできますが、最終的に Azure Web サイト VM には、node-canvas が実行に依存する GDI+ API がありません (おそらくセキュリティ上の理由からブロックされています)。Azure でノード キャンバスが必要な場合は、Azure Web サイトを使用できず、代わりに独自の VM をセットアップして管理する必要があります。

于 2014-08-06T02:04:08.890 に答える