我正在尝试将以下示例节点应用程序部署到 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 以使应用程序正常工作:
原生模块
虽然大多数模块只是纯文本 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
但该文件实际上部署在服务器上:
创建虚拟机显然是一种选择,但我更喜欢使用网站。有人知道我可以试试吗?