将节点本地模块部署到Azure WebSites

我正在尝试将以下示例节点应用程序部署到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以使应用程序正常工作:

原生模块

尽pipe大多数模块都是纯文本JavaScript文件,但某些模块是特定于平台的二进制映像。 这些模块是在安装时编译的,通常使用Python和node-gyp。 Azure网站的一个特定限制是,虽然它本身理解如何安装在package.json或npm-shrinkwrap.json文件中指定的模块,但它不提供Python或node-gyp,并且不能构build本地模块。

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

Azure网站不支持本机模块。 一些模块(如JSDOM和MongoDB)具有可选的本地依赖项,并且可以与Azure网站中托pipe的应用程序一起使用。

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

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

但是这个文件实际上是部署在服务器上的:

文件夹上的文件

创build虚拟机显然是一个select,但我宁愿使用网站。 任何人有任何想法,我可以尝试?

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

我假设你在Windows中使用了构build指令 。 如果您在指令中针对GTK2 zip文件构build了canvas,则可以将%GTKDIR%\ bin \ freetype6.dll复制到%YourApp%\ node_modules \ canvas \ build \ Release。 这个DLL不会在构build过程中被复制。 您也需要将其部署到虚拟机。 或者,您可以在Windows GTK3捆绑软件上构buildcanvas。

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

好吧,今天工作!

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

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