前言: 好久沒有寫博客了,上次發表博客還是在5月的時候,主要是4月多入職的新公司,5月份就開始做項目一直忙到這個月的中旬項目上線才偷得浮生半日閑,但是項目上線後客戶還是隔三差五的提個問題,不是改BUG就是添加新的東西,本來想著一邊看編程思想一邊把每章的讀後感寫出來發出來的,但是天天忙著加班雖然也抽時 ...
前言:
好久沒有寫博客了,上次發表博客還是在5月的時候,主要是4月多入職的新公司,5月份就開始做項目一直忙到這個月的中旬項目上線才偷得浮生半日閑,但是項目上線後客戶還是隔三差五的提個問題,不是改BUG就是添加新的東西,本來想著一邊看編程思想一邊把每章的讀後感寫出來發出來的,但是天天忙著加班雖然也抽時間看到第15章了,但是讀書筆記基本沒寫,最多就是會寫一點思維導圖,現在項目到結尾的部分了,還得繼續看書寫博客,以上全屬於廢話,下麵進入今天的正文。
問題描述:
昨天下午客戶打電話說有個功能不好使了,點擊按鈕保存的時候沒反應,讓趕緊解決一下,然後我就趕緊去看一下客戶說出問題的地方,簡單的說就是選擇幾個數據,然後彈出個視窗,在彈出的視窗中給選擇的數據添加一些新的內容,然後保存,添加的東西可以是資料庫中已有的,也可以是客戶手動輸入的,功能很簡單,然後我就在我電腦上跑了一下,沒出現客戶說的的問題啊,然後就趕緊去找測試組的人,讓他們再測一下這個問題,過了一會兒測試組的人過來說也沒問題啊,這我就炸了,心想尼瑪不是在逗我玩呢吧?然後用我們的賬號登上了客戶的系統,一看還真是不好使了,不管是選擇已有的數據還是新添加數據,點擊保存的時候都不好使,我了個去。
解決過程:
1.瀏覽器控制台看錯誤
登不上客戶的伺服器,只能通過瀏覽器的控制台先看一下有沒有問題?一看還真有問題,什麼問題呢?
length屬性未定義,這是什麼鬼?趕緊點進去看js代碼,這裡是一個非同步請求,返回的是數據的數據,並且是一個數組,這下就鬱悶了,返回的就是數組啊,數組不應該是有length屬性的嗎?你告訴我length 屬性未定義是什麼鬼?首先想到的是是不是瀏覽器不相容啊,但是也不對啊,我用的是同樣的瀏覽器,為毛訪問我本地的就行但是訪問客戶的就不行了,這個可能被排除,然後,然後就下班了,想著今天來再解決 吧,回家坐車的時候還在想既然是length屬性未定義,那麼可不可以繞過去呢,不用length屬性,因為是做for迴圈,那麼能不能換成for-in迴圈來做呢?然後就想著今天早上再來試試;
2.查看response結果
早上來的時候本來是要實驗一下昨天的想法的,但是早上突然靈機一動想到,是不是應該先看看伺服器響應的結果是啥呢?如果響應的不是數組,那怎麼會有length屬性呢?到了公司就趕緊打開瀏覽器,熟練 的按下F12,點開NetWork,一看還真的是發現問題了,本來響應的應該是一個json數組([{},{},{}]),但是現在響應的是一個對象({},這就炸了,返回的是對象,怎麼可能會有length屬性嘛,不對啊,怎麼 會返回一個對象呢,仔細看了一下,返回的對象裡面有個msg屬性,裡面是有個<script>標簽,標簽裡面是一個方法,還有一個success屬性,結果是false,這尼瑪不是系統裡面用來後臺向前臺發送數據的時候用 的嗎?然後在項目裡面搜索一下msg中的那個方法,還真的找到了,這個方法主要作用是在用戶沒有登錄直接訪問系統時候直接跳轉到登錄頁面,這又是什麼鬼?怎麼還牽扯到跳轉登錄頁面了,繼續苦逼的找問 題;
3.確定問題
系統中只有在沒有登錄的時候或者訪問的路徑不對的時候才會跳轉到登錄頁,用有問題的url訪問確實跳轉登錄頁了,但是已經是登錄過的了,那麼排除沒登錄的問題,那就只能是URL出錯了才會這樣,然後仔細比對了一下沒問題的URL和有問題的URL,終於發現了問題,尼瑪誰多寫了個項目名稱,原來出問題的URL中多了一個項目名稱,然後趕緊去看代碼,有問題的URL在代碼中是這麼寫的"/projectName/......",沒問題的URL在代碼中是這麼寫的"${basePath}/.......",但是這麼寫為什麼在本地都沒問題呢?仔細一看本地的URL,都是前一種,但是在客戶伺服器上的URL都是"功能變數名稱:prot/....",這時候突然想到了以前用過虛擬功能變數名稱,在tomcat的conf/sever.xml文件中配置一下就可以了,但是現在沒有用虛擬功能變數名稱,所以本地訪問的時候都會帶上的項目名稱,但是如果在conf/sever.xml中的<host>節點中配置了docBase屬性,那麼URL中就可以不帶項目名稱,想到這裡趕緊登上客戶的伺服器去看server.xml,尼瑪還真是配置了docBase = "項目真實路徑/項目名稱",到此終於發現了問題了根源了。
4.解決辦法
既然發現問題了,那就好解決問題了,但是這時候大家肯定又疑問了,你標簽是"${basePath}引發的血案",但是你的問題跟${basePath}有毛關係啊,小伙子你還是太年輕啊,因為"${basePath}/......."這種形式的路徑獲取到的就是項目的絕對路徑,而且不管是部署在伺服器上還是部署在本地都能獲取到,但是如果你寫的是"/projectName/......"這種路徑,一旦項目名稱或者說是文件夾名稱改變,或者說就像本文所提到的設置了docBase屬性,那你就咖喱給給了。
此文終結,有說的不對的地方歡迎指正。