我正在尝试将以下示例节点应用程序部署到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
但该文件实际部署在服务器上:
创建VM显然是一种选择,但我更喜欢使用网站。任何人都知道我可以试试吗?
答案 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。