如何使角度应用程序从命令行获取参数?

时间:2016-12-28 05:23:53

标签: angularjs

我有一个AngularJS应用程序,我的代码看起来像这样:

myApp = angular.module('myApp',
  [
    'ui.router',
    'ngMaterial',
    'ngMessages'
  ]
);

myApp.constant('CONSTANTS', (function() {
  // Define your variable
  return {
    backend: {
      baseURL: 'http://mybackend.com:3026'
    }
  };
})());

我在端口号8000上使用http-server运行此应用程序,如下所示:

% http-server -p 8000

我想传递backend.baseURL的命令行参数,使其超越代码中指定的值。我该怎么办?

5 个答案:

答案 0 :(得分:3)

您需要的是至少需要支持动态内容的http服务器。而您的http服务器仅支持静态内容。

在评论中,您询问应该使用哪个服务器。有成千上万的Web服务器支持动态内容。但是你正在使用的是http-server我假设你只想要一个本地开发的小型服务器。

不幸的是,在没有修改代码的情况下,我找不到任何支持您需求的服务器。所以我建议你在npm上的库上创建自己的服务器。

这是使用live-server的示例服务器。

var liveServer = require("live-server");
var fs = require("fs")

var root = process.argv[2] || "."
var port = process.argv[3] || 8000

var replaceTextMiddleWare = function(req, res, next){

    var file = process.argv[4]
    var find = process.argv[5]
    var replace = process.argv[6]

    if(file && find){
        if(req.url === file) {
                fs.readFile( root + file, "utf-8", function(e, content){
                    res.end( content.replace(find, replace))
                } )

                return;
        }
    }


    next();
}

var params = {
    port: port, // Set the server port. Defaults to 8080.
    host: "0.0.0.0", // Set the address to bind to. Defaults to 0.0.0.0 or process.env.IP.
    root: root, // Set root directory that's being server. Defaults to cwd.
    open: false, // When false, it won't load your browser by default.
    ignore: 'scss,my/templates', // comma-separated string for paths to ignore
    file: "index.html", // When set, serve this file for every 404 (useful for single-page applications)
    wait: 1000, // Waits for all changes, before reloading. Defaults to 0 sec.
    mount: [['/components', './node_modules']], // Mount a directory to a route.
    logLevel: 2, // 0 = errors only, 1 = some, 2 = lots
    middleware: [ replaceTextMiddleWare ] // Takes an array of Connect-compatible middleware that are injected into the server middleware stack
};


liveServer.start(params);

然后您可以通过

运行您的服务器
nodejs myserver.js /mydocument/myproject/ 8000 config.js "http://mybackend.com:3026" "http://mydevserver.com:80"

命令接受参数:

  • 提供内容的途径
  • 端口
  • 文件名
  • 要查找的文字
  • 要替换的文字

此服务器仅支持一个简单查找/替换的动态文件。 从这一点来说,我猜你可以修改中间件来做你想做的事。

答案 1 :(得分:1)

当我在生产中完成此操作时,我使用构建过程,在这种情况下使用gulp,

  var knownOptions = {
    string: 'env',
    default: { env: process.env.NODE_ENV || 'default' }
  };

  var options = minimist(process.argv.slice(2), knownOptions);

  console.log("using config : " + chalk.blue(options.env));

我们得到一个环境变量默认使用最小化的默认值,我们可以传递-env'tring'

然后在代码中将动态文件推送到app.js

  //now we use options.env
  appJS.push("env/"+options.env+".js");

env / [options.env] .js这是一个导出环境特定常量的角度模块

答案 2 :(得分:1)

看起来你没有使用gulp但是你正在使用来自package.json的节点脚本。如果您正在使用gulp,那么这应该不是您通过gulp使用http-server的问题。 在你当前的情况下你可以做的一件事是作为你的运行命令的一部分,设置process.env.baseUrl =“动态”然后粗略地说,在你的代码中使用这个

return {
backend: {
  baseURL:process.env.baseUrl || 'http://fallbackurl'
}

答案 3 :(得分:1)

基本上我的理解是你想为自己的定制处理自定义http-server包。

这是我找到的小解决方案......

转到节点安装文件夹(在我的情况下是本地文件夹)...

因此我们要编辑的文件路径就是这样......

<强> ../ node_modules / HTTP服务器/ LIB / HTTP-server.js

导入一个为您提供命令行参数的包...您不需要安装它,它已经存在。

var argv = require('optimist').boolean('cors').argv; // add this line at排在第7行之后

现在

在第60行,在代码 before.push(function (req, res) { 之后添加以下代码..

if( req.url === '/backend-url' ) {
  return res.end(JSON.stringify(argv.x));
}

所以在推送功能看起来像::

之前
  before.push(function (req, res) {
    if( req.url === '/backend-url' ) {
      return res.end(JSON.stringify(argv.x));
    }
    if (options.logFn) {
      options.logFn(req, res);
    }

    res.emit('next');
  });

现在我们为http-server配置了新的命令行参数x,它将返回url“/ backend-url”

现在在前端

myApp.constant('CONSTANTS', ('$http', function($http) {
// Define your variable
**var backendURL = (function() {
    return $http.get('/backend-url', function(bUrl) {
        return bUrl;
    })
})();**
return {
    backend: {
        baseURL: backendURL
    }
};
})());

Done, now you add url like this: **http-server -p 8080 -x http://example.com**

I choose this approch as replacing file content i dont think good in you case 

答案 4 :(得分:1)

如果您只使用应用程序的一个实例,则可以使用脚本启动它,该脚本接受所有必需的命令行参数,替换应用程序js文件中的相应占位符(例如,特定注释之间的字符串),然后启动http-服务器在必要的端口上。