我有一个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脚本运行我的应用程序?
答案 0 :(得分:1)
由于scripts
中的package.json
用于npm
cli,例如项目中的npm start
来运行应用程序。但是,Azure Web Apps上的node.js应用程序由iisnode托管,它将绕过packages.json
文件。
您可以考虑以下解决方法:
将自定义模块(此处为config
文件夹)移动到根目录中的node_modules
文件夹中。当您使用require('config')
时,该流程将搜索config
文件夹中的模块“node_modules
”
保留应用程序的体系结构,修改需要涉及自定义模块的脚本代码,例如var config = require('../config');
以涉及模块的相对路径
答案 1 :(得分:0)
你不需要在Azure网络应用程序中执行npm start,npm start实际上会查找package.json文件,并使用package.json文件中的配置运行因此指定的脚本,而在Azure Web应用程序中 - azure平台在root中查找app.js或server.js文件的存在,并在其上执行node <server.js>
命令。
在了解azure如何运行nodejs app http://blogs.msdn.com/b/silverlining/archive/2012/06/14/windows-azure-websites-node-js.aspx时,我觉得这篇文章非常有趣。
如果您不想将整个node_modules文件夹发送到Web应用程序,那么您必须拥有package.json文件,而azure将为您的Web应用程序运行npm。