部署後的驚喜
AJAX URL設置
另外Deploy完才發現AJAX的URL出了問題,又花了兩三個小時才解決這個問題(處處是驚喜啊汗顏)
首先 AJAX的URL預設是不能跨站請求的(有解),所以理論上所有的URL都是指向Server,所以在URL解析上自帶Server IP,舉例來說
$.ajax({
type: "POST",
//自動轉成 http://server_ip/signup
url: "/signup",
data: sendData,
success: function(data){
},
error: function(data){
}
});
但你也可以設定絕對路徑(這個詞怪怪的,但我想不到更好的用語)
$.ajax({
type: "POST",
url: "http://server_ip/signup",
data: sendData,
success: function(data){
},
error: function(data){
}
});
我一開始在local端開發,全部用絕對路徑http://127.0.0.1:300/...開發,deploy到Server出現了跨站請求失敗,後來還跑去[stackoverflow發問](http://stackoverflow.com/questions/35767024/how-to-set-global-variables-by-command),
真的是好傻啊,在Client端發出localhost請求當然會失敗啊OTZ
後來開始想如何動態設置AJAX的URL,所幸自己怒寫一個Shell Script
Shell Script與動態設置Config
設定的想法很簡單
1.取得AWS的public IP
2.設置一個nodeJS檔讀取IP輸入值
3.將IP輸入值寫到JSON file中
4.各個JS file 讀取此JSON file裡頭的Server IP,完成AJAX URL設置
以下是我編寫的檔案
myURL.js->步驟2&3
var fs = require("fs");
setUpURL();
//Set up URL
function setUpURL(){
var myURL = process.argv[2];
console.log('myURL: ', myURL);
console.log("success");
var outputFilename = 'public/myURL.json';
var myData = {
port:myURL
}
console.log(myData);
fs.writeFile(outputFilename, JSON.stringify(myData, null, 4), function(err) {
if(err) {
console.log(err);
} else {
console.log("JSON saved to " + outputFilename);
}
});
};
init.sh->步驟1(記得要 chmod +x init.sh修改權限喔) 此方法只適用於AWS
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
//取得AWS Server public IP
line="$(curl http://169.254.169.254/latest/meta-data/public-ipv4)"
echo $line
node myURL.js "http://"$line":3000"
exit 0
各別JS file需要讀取myURL.json(注意各個URL可能會有所不同,我是設置在/public/底下)
var myURL;
$.getJSON("myURL.json", function(json) {
myURL = json.port.toString();
console.log(myURL);
});
$.ajax({
type: "POST",
url: myURL+"/signup",
data: sendData,
success: function(data){
},
error: function(data){
}
});
只要第一次執行init.sh之後就OK了 但真正簡單的解決方式是用地一種相對路徑的URL設置...我會發現這一點是因為一開始我的myURL設成"server_ip"而非"http://server_ip" ,結果發ajax時出現 "http://server_ip/server_ip" 連出現兩次,後來才恍然大悟OTZ