我有一个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
的命令行参数,使其超越代码中指定的值。我该怎么办?
答案 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-服务器在必要的端口上。