【发布时间】:2014-09-28 08:40:06
【问题描述】:
我正在尝试将以下示例节点应用程序部署到 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
但该文件实际上已部署在服务器上:
创建虚拟机显然是一种选择,但我更喜欢使用网站。有人知道我可以试试吗?
【问题讨论】:
标签: node.js azure azure-web-app-service node-modules azure-deployment