如何使角应用程序从命令行获取参数?
我有一个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
,使其覆盖代码中指定的值。我该怎么做??
您需要的是至少需要支持动态内容的http-server。而你的http服务器仅支持静态内容。
并在评论中询问你应该使用哪个服务器。有数千个支持动态内容的网络服务器。但你正在使用sinc 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"
运行服务器的命令接受参数:
- 路径提供内容
- 端口
- 文件名
- 文本找到
- 要替换的文本
此服务器仅支持一个带简单查找/替换的动态文件。 从这一点来说,我猜你可以修改中间件来做你想做的任何事情。
当伊夫这样做在生产我用这个生成过程中,在这种情况下使用一饮而尽,
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));
我们得到了一个环境变量默认使用minimist拖欠我们可以通过-env“串”
然后进一步在代码推动态文件到app.js
//now we use options.env
appJS.push("env/"+options.env+".js");
ENV/[options.env]的.js这里是出口环境specifi的角模块c常量
看起来你不是使用gulp,而是使用package.json中的节点脚本。如果你使用gulp,那么这应该不是你通过gulp使用http-server的问题。 你现在可以做的一件事是作为你的运行命令的一部分,设置process.env。的baseUrl =“动态”,然后粗略地讲,在你的代码中使用此类似这样的
return {
backend: {
baseURL:process.env.baseUrl || 'http://fallbackurl'
}
基本上我的理解是,你要自定义HTTP-server软件包为您赢得了自定义处理。
这里是小的解决方案,我发现你....
转到节点安装文件夹(在我的情况下,当地一个)......
所以我们要编辑文件的路径像这样...
../node_modules/http-server/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');
});
现在我们已经配置了新的命令行参数x对于HTTP服务器,这将对于网址“/后端-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
如果您使用的只有一个实例被返回您的应用程序,您可以使用脚本启动它,它接受所有必要的命令行参数,在应用程序js文件中替换适当的占位符(例如特定注释之间的字符串),然后在必要的端口上启动http-server。
您需要的是至少需要支持动态内容的http-server。而你的'http-server'只支持静态内容。 – Hereblur
Hereblur,你能告诉我如何?我应该使用哪个服务器? –
我认为这个配置应该是你的构建设置的一部分,而不是服务器设置。 – gvmani