5

我正在尝试将以下示例节点应用程序部署到 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 进行编译。

根据Microsoft 页面 Azure 网站不支持本机模块,应将模块的编译版本复制到 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

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

文件夹中的文件

创建虚拟机显然是一种选择,但我更喜欢使用网站。有人知道我可以试试吗?

4

3 回答 3

5

错误消息“找不到指定的模块”有点误导。这可能意味着找不到一个或多个依赖的 dll。

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

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

于 2014-08-06T01:02:40.443 回答
2

好的,今天开始工作了!

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

于 2014-10-23T19:29:47.237 回答
0

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

于 2014-08-06T02:04:08.890 回答