Azure NODE_PATH环境变量没有任何影响



我有一个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。

相关内容

最新更新