我正在尝试将以下示例节点应用程序部署到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);棘手的部分是,我正在使用一个名为"画布“的节点模块,它需要在安装时使用node进行编译。
据这称,Azure网站不支持Microsoft页面本机模块,并应将模块的编译版本复制到Azure中,以使应用程序正常工作:
本机模块 虽然大多数模块只是纯文本JavaScript文件,但有些模块是特定于平台的二进制图像.这些模块是在安装时编译的,通常使用Python和node进行编译。Azure站点的一个特定限制是,虽然它本机了解如何安装package.json或npm缩缩. does文件中指定的模块,但它不提供Python或节点-gyp,也不能构建本机模块。 由于依赖于作为应用程序一部分部署的node_modules文件夹,因此只要在上安装和编译,作为已安装模块的一部分的任何本机模块都应该在云服务中工作。 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显然是一种选择,但我更喜欢使用网站。有人知道我可以试试看吗?
发布于 2014-08-06 01:02:40
错误消息“无法找到指定的模块”有点误导。它可能意味着找不到一个或多个依赖的dll。
我以为你在Windows中使用了构建指令。如果使用说明中的GTK2压缩文件构建画布,则可以将%GTKDIR%\bin\freetype6.dll复制到%YourApp%\node_modules\canvas\build\Release。在生成过程中不会复制此dll。您还需要将此部署到VM中。或者您可以在Windows GTK3包上构建画布。
不幸的是,即使在您拥有所有dll之后,Azure网站的沙箱似乎也会阻止画布运行。希望能在不久的将来启用。
发布于 2014-10-23 19:29:47
好吧,今天开始工作了!
您需要部署您的node_modules目录,此外,您还需要将所有内容gtk/bin复制到应用程序的根目录,这使得它有点混乱,但它可以工作。我想你可以改变路径去寻找其他地方,但我需要让应用程序运行,所以我没有做进一步的调查。
发布于 2014-08-06 02:04:08
@mtian的答案中的最后一行是关键。您可以花时间让它进行部署,但最终Azure网站VM缺少节点-画布所依赖的GDI+ API(可能是出于安全考虑而阻止的)。如果您想要在Azure上的节点-画布,您不能使用Azure网站,而是需要设置和管理您自己的VM。
https://stackoverflow.com/questions/25142980
复制相似问题