Azure NODE_PATH环境变量没有任何效果

时间:2016-01-09 22:43:18

标签: node.js azure environment-variables

我有一个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脚本运行我的应用程序?

2 个答案:

答案 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。