警告:這不是從heroku訪問config vars最安全的方法。如果你有非常敏感的密鑰,你不想被攻擊,那麼找一個更安全的方法來做到這一點。
我使用Heroku-Client API從特定的heroku應用程序中使用node.js提取Config Vars,並使用get請求將它們發送到前端。
//server.js
const express = require('express');
const http = require('http');
const path = require('path');
const Heroku = require('heroku-client')
const heroku = new Heroku({ token: process.env.API_TOKEN })
const app = express();
let API_KEY = '';
app.use(express.static(path.join(__dirname, 'dist')));
heroku.request({
method: 'GET',
path: 'https://api.heroku.com/apps/name-of-app/config-vars',
headers: {
"Accept": "application/vnd.heroku+json; version=3",
"Authorization": "Bearer "+process.env.API_TOKEN
},
parseJSON: true
}).then(response => {
//console.log(response, "heroku api...");
API_KEY = response.API_KEY;
})
app.get('/heroku-env', function(req, res){
res.write(API_KEY);
res.end();
});
app.get('*', (req, res) => {
res.sendFile(path.join(__dirname, 'dist/index.html'))
});
const port = process.env.PORT || '3001';
app.set('port', port);
const server = http.createServer(app);
server.listen(port,() => console.log(`Running on localhost:${port}`));
然後使用HTTP服務獲得對前端的響應。
//EnvService.js
import { Injectable } from '@angular/core';
import { Http, Response, RequestOptions, Headers, Request, RequestMethod }
from '@angular/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
@Injectable()
export class EnvService{
env:Observable<any> = null;
constructor(private http:Http){}
getEnv() {
console.log("trying to get heroku env...");
this.env = this.http.get('/heroku-env').map(response => response)
return this.env;
}
}
將服務導入到app.module中,然後訂閱組件中的res以訪問config vars。
//my.component.js
import { Component, ViewChild, Inject } from '@angular/core';
import { EnvService } from './env.service';
@Component({
selector: 'my-component',
templateUrl: './my.component.html',
styleUrls: ['./my.component.css']
})
export class MyComponent {
defineToken: string = '';
constructor(private envService: EnvService) {}
loadEnv() {
this.envService
.getEnv().subscribe(res => {
this.defineToken = res._body;
})
}
ngOnInit() {
this.loadEnv();
}
}
引用:https://github.com/heroku/node-heroku-client
什麼是要注入到客戶端的東西呢?無論是在環境中還是在源代碼中,它們都不會安全,因爲它們最終無法控制用戶的設備。 – jonrsharpe
評論heroku:https://devcenter.heroku.com/articles/node-best-practices#be-environmentally-aware :: environment:process.env.NODE_ENV || '生產', –
剛剛發現[這個答案](http://stackoverflow.com/questions/41348751/heroku-pipeline-with-angular-2-environments),它實際上是我需要的,但作爲不可能的答案。 任何人都知道如何去做建議呢? 「更好的選擇可能是讓您的Angular2應用在初始化時查詢您的服務器」 –