Efi*_*sky 4 environment production angular
我有一个大型 Angular 应用程序,在开发中仍然需要,但已经准备好在生产中使用,我想通过简单的更改来在状态之间切换
isProduction: boolean = false
Run Code Online (Sandbox Code Playgroud)
为了正确,我通过制作 apiHelperService 来做到这一点,这只是普通的服务,它对于大多数应用程序都可以正常工作:
import {Injectable} from "@angular/core";
import {Response, Http, Headers, RequestOptions} from "@angular/http";
import {Observable} from "rxjs/Observable";
@Injectable()
export class ApiHelperService {
productionURL: string = 'http://35.203.121.40';
developmentURL: string = 'http://10.25.37.523';
serverUrl: string;
apiPort: string = ':3000/';
socketPort: string = ':2000/';
isProductionMode: boolean = false;
constructor() {
this.serverUrl = this.isProductionMode ? this.productionURL : this.developmentURL;
}
getApiURL(): string {
return this.serverUrl + this.apiPort;
}
getSocketUrl(): string {
return this.serverUrl + this.socketPort;
}
getApiIp(): string {
const serverIp = this.isProductionMode ? this.productionURL.split(':')[0] : this.developmentURL.split(':')[0];
console.log('string url is:', serverIp);
return serverIp;
}
serialize(obj) {
var str = [];
for (var p in obj) {
if (obj.hasOwnProperty(p) && ((obj[p] != null && obj[p] != '') || (typeof obj[p] == "boolean"))) {
if (obj[p].length == 0) {
continue;
}
else if (obj[p].length > 1 && typeof obj[p] == 'object') { // reformats arrays
for (let i = 0; i < obj[p].length; i++) {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p][i]));
}
}
else {
str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
}
}
}
return '?' + str.join("&");
}
extractData(res: Response) {
let body = res.json();
// console.log("body", body)
return body || {};
}
handleError(error: Response | any) {
let errMsg: string;
if (error instanceof Response) {
const body = error.json() || '';
const err = body.error || JSON.stringify(body);
errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
} else {
errMsg = error.message ? error.message : error.toString();
}
console.error(errMsg);
return Observable.throw(errMsg);
}
}
Run Code Online (Sandbox Code Playgroud)
但我有套接字库,可以在
应用程序模块.ts
所以当我尝试使用动态 URL(在 app.module.ts 中)时,如下所示:
const apiHelper = new ApiHelperService(); //fails here
const url: string = apiHelper.getSocketUrl();
const config: SocketIoConfig = { url: url, options: {
"force new connection" : true,
"reconnectionAttempts": "Infinity",
"timeout" : 10000,
"transports" : ["websocket"]} };
Run Code Online (Sandbox Code Playgroud)
它因以下错误而失败:
ERROR in Error: Error encountered resolving symbol values statically. Calling
function 'ApiHelperService', function calls are not supported. Consider replacing the function or lambda with a
reference to an exported function, resolving symbol AppModule
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,我的方法是错误的吗?处理这个问题的正确方法是什么?
它以不同的方式工作:alligator.io/angular/environment-variables
您必须在environment.ts和environment.prod.ts中指定变量
然后从 '../../environments/environment' 导入 {environment} ; 环境对象将包含适当的变量
| 归档时间: |
|
| 查看次数: |
7815 次 |
| 最近记录: |