将Node本机模块部署到Azure WebSites

pso*_*usa 5 azure node.js azure-deployment node-modules azure-web-sites

我正在尝试将以下示例节点应用程序部署到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);
Run Code Online (Sandbox Code Playgroud)

棘手的部分是我正在使用一个名为" 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
Run Code Online (Sandbox Code Playgroud)

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

文件夹上的文件

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

mti*_*ian 5

错误消息""无法找到指定的模块"有点误导.它可能意味着找不到一个或多个相关的dll.

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

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