我有一个NodeJS项目部署到Azure,其中包含一些项目范围的模块,如config。
├── bin
│ └── start
├── config
│ └── index.js
└── web.config
在本地,我用npm start
启动我的应用程序,它在Windows上运行正常。
"scripts": {
"start": "SET NODE_PATH=.& node bin/start"
}
在Azure上,我还没有找到从package.json
运行脚本的方法,因此我将web.config
更改为运行node bin/start
。
NODE_PATH env变量通过"应用程序设置"->"应用程序设定"设置,并正确响应。然而,它没有任何效果。
bin/start
文件输出env-vars和错误消息Start "production" - "." - "Cannot find module 'config'"
:
var http = require('http');
var util = require('util');
var nconf = require('nconf');
nconf.argv()
.env();
var configMsg = 'default msg';
try {
var config = require('config');
if(config) {
configMsg = 'WOOT!';
}
} catch (e) {
configMsg = e.message;
}
http.createServer(function(req, res) {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end(
util.format(
'Start "%s" - "%s" - "%s"',
nconf.get('NODE_ENV'),
nconf.get('NODE_PATH'),
configMsg
)
);
}).listen(process.env.PORT);
如何使Azure理解NODE_PATH?
或者,我如何告诉Azure使用像npm start
这样的npm脚本运行我的应用程序?
因为package.json
中的scripts
用于npm
cli,就像您的项目中用于运行应用程序的npm start
一样。但是,Azure Web Apps上的node.js应用程序由iisnode托管,它将绕过packages.json
文件。
您可以考虑以下解决方案:
-
将您的自定义模块(此处为
config
文件夹)移动到根目录中的node_modules
文件夹中。当您使用require('config')
时,该过程将在node_modules
文件夹中搜索模块"config
" -
保留应用程序的体系结构,修改需要涉及自定义模块的脚本代码,例如
var config = require('../config');
,以涉及模块的相对路径
您不需要在Azure web应用程序中进行npm启动,npm启动实际上会查找package.json文件,并使用package.jsn文件中的配置运行针对它指定的脚本,而在Azure web app中,Azure平台会在根目录中查找app.js或server.js文件,并对其执行node <server.js>
命令。
当谈到理解azure如何运行nodejs应用程序时,我觉得这篇文章非常有趣http://blogs.msdn.com/b/silverlining/archive/2012/06/14/windows-azure-websites-node-js.aspx.
如果你不想将整个node_modules文件夹发送到web应用程序,那么你必须随身携带一个package.json文件,azure将为你的web应用程序运行npm。