将Node本机模块部署到Azure WebSites

时间:2014-08-05 15:42:56

标签: node.js azure azure-web-sites node-modules azure-deployment

我正在尝试将以下示例节点应用程序部署到Azure网站:

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);

棘手的部分是我正在使用名为“canvas”的节点模块,需要使用node-gyp在安装时进行编译。

根据this Azure网站不支持Microsoft页面本机模块,并且应将模块的编译版本复制到Azure以使应用程序正常工作:

  

原生模块

     

虽然大多数模块只是纯文本JavaScript文件,但有些   模块是特定于平台的二进制映像。这些模块是   在安装时编译,通常使用Python和node-gyp。一   Azure网站的具体限制是本机的   了解如何安装package.json或中指定的模块   npm-shrinkwrap.json文件,它不提供Python或node-gyp和   无法构建本机模块。

     

由于Azure云服务依赖于node_modules文件夹   作为应用程序的一部分部署,包括任何本机模块   部分已安装的模块应该在云服务中工作   因为它是在Windows开发系统上安装和编译的。

     

Azure网站不支持本机模块。一些模块   例如JSDOM和MongoDB都有可选的本机依赖项,​​并且会   使用Azure网站中托管的应用程序。

我将所有内容部署到Azure(使用发布向导),所有文件都发送到Azure(显然至少),包括已编译的模块。在Azure上运行站点时,我获得以下异常:

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

但该文件实际部署在服务器上:

files on folder

创建VM显然是一种选择,但我更喜欢使用网站。任何人都知道我可以试试吗?

3 个答案:

答案 0 :(得分:5)

错误消息&#34;&#34;找不到指定的模块&#34;有点误导。它可能意味着找不到一个或多个相关的dll。

我假设您在Windows中使用了build instruction。如果您在指令中针对GTK2 zip文件构建了canvas,则可以将%GTKDIR%\ bin \ freetype6.dll复制到%YourApp%\ node_modules \ canvas \ build \ Release。在构建过程中不会复制此dll。您还需要将此部署到VM。或者您可以针对Windows GTK3 bundle构建画布。

不幸的是,即使你拥有了所有的dll,Azure网站的沙箱也似乎阻止了画布的运行。希望它能在不久的将来启用。

答案 1 :(得分:2)

好吧今天就这样工作了!

除了需要将所有内容node_modules复制到应用程序的根目录之外,您还需要部署gtk/bin目录,这使得它有点混乱,但它确实有效。我想你可以改变寻找其他地方的路径,但我需要让应用程序运行,所以我没有进一步调查。

答案 2 :(得分:0)

@ mtian的回答中的最后一行是关键。您可以花时间部署它,但最终Azure网站虚拟机缺少节点 - 画布依赖执行的GDI + API(可能出于安全考虑而被阻止)。如果您想在Azure上使用node-canvas,则无法使用Azure网站,而是需要设置和管理自己的VM。