【问题标题】:Azure NODE_PATH environment variable doesn't have any effectAzure NODE_PATH 环境变量没有任何影响
【发布时间】:2016-04-14 11:29:38
【问题描述】:

我有一个 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 环境变量通过“应用程序设置”->“应用程序设置”设置并正确回显。但是,它没有任何作用。

bin/start 文件输出环境变量和错误消息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 脚本运行我的应用程序?

【问题讨论】:

    标签: node.js azure environment-variables


    【解决方案1】:

    由于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'); 以涉及模块的相对路径

    【讨论】:

    • 感谢您的回答!不幸的是,这些解决方法不适合我。 1)node_modules被排除在git之外,项目结构已确定; 2) require('../config') 变为 require('../../../../config')models = require('../../models') 等。第一个选项似乎是两个选项中最不痛苦的。如果iisnode绕过packages.json并忽略npm,它如何安装依赖?为什么它会忽略环境变量?
    • 命令npm install由部署任务运行,但iisnode,您可以参考github.com/projectkudu/kudu/wiki/Deployment-hooks获取此信息。
    • 感谢您的链接!会调查的。
    【解决方案2】:

    您不需要在 Azure Web 应用程序中执行 npm start,npm start 实际上会查找 package.json 文件并使用 package.json 文件中的配置对其指定的脚本运行,而在 Azure Web 应用程序中 - 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。

    【讨论】:

    • 我实际上需要能够运行package.json 中指定的任何脚本,在这种情况下,脚本将帮助我为我的应用程序指定正确的环境变量。我知道web.config 中的启动文件可以更改为任何内容,在我的情况下为node bin/www
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2020-01-22
    相关资源
    最近更新 更多