2016-07-20 35 views
0

這個問題是有關:when I refresh the page, not the page loads. Angularjs + Nodejs如何使用expressjs處理nodejs中#號的路由?

但在這種情況下,我禁用html5mode,因此,符號出現的URL#。我希望有我下面顯示代碼的某些部分控制訪問,但不知道如何處理#

app.get(['/homepage', '/recoveryPassword', '/manageAccount', '/shop/:itemId/cat/:categoryId', '/shop/:shopName', '/manageMyShops', '/manageMyShops/id/:shopId', '/manageWeb'], isLoggedIn, function (req, res) { 
     res.end();  
    }); 
+0

URL哈希('#xxxxx')沒有被髮送到服務器,它只被瀏覽器使用。與角度無關......只是散列的工作原理 – charlietfl

+0

在端點名稱中包含特殊字符值是很常見的。爲了簡化事情 - 你應該可以在expressJS中間件中添加一個'layer'來將'#'轉換爲某個東西,一個獨特的詞或者什麼。然後相應地註冊您的端點。如果你不介意,我可以用我的想法作爲你的答案。 –

+0

@SamuelToh請給我一個幫助。謝謝! –

回答

0

我不願意張貼這一點,因爲我覺得這是不是一個真正的解決方案,OP的問題。對我來說這是一個破解,所以使用它需要您自擔風險。

首先,REST網址中包含特殊字符(如'#')是非常規的。雖然我相信沒有標準的端點命名方式,但建議確保URL遵循這些規則;

  1. 所有小寫(因爲URL是不區分大小寫)
  2. 沒有特殊字符
  3. 沒有駱駝

不管怎樣,我的做法是。

關於服務器代碼;

  1. 假設你正在定義一個路徑/config#,那麼用'#'字符替換一些獨特的東西。 _bbb夠獨特嗎?你判斷,只要確保它不與其他端點衝突。
  2. 添加一個快速圖層來解碼URL的特殊字符,並用您在第1點給出的唯一字替換特殊字符(當您看到代碼時,這將更加清晰)。

客戶端代碼:

  1. 編碼的URL。爲什麼?由於URL不能包含'#',因爲它是一個保留字符。所以它必須被編碼爲'%23'。

實施例:

客戶:

"use strict"; 
let request = require("request"); 

let req = { 
    url: `localhost:4444/${encodeURIComponent('config#')}`, 
    proxy: 'http://localhost:4444', 
    method: 'GET', 
    headers: { 
     'Content-Type': 'application/json' 
    } 
}; 

request(req, function (err, res, body) { 
    this.config = JSON.parse(body); 
    console.log("response => " + this.config); 
}); 

服務器:

"use strict"; 
var express = require("express"); 
var bodyParser = require("body-parser"); 
var app = express(); 
var config = require('config'); 

app.use(bodyParser.json()); 
app.use((req, res, next) => { 
    let decoded_url = decodeURIComponent(req.url); 
    req.url = decoded_url.replace('#', '_bbb'); 
    next(); 
}); 

app.get('/config_bbb', function(req, res){ 
    res.json('{name: test}'); 
}); 


// Start the server 
app.set('port', 4444); 

app.listen(app.get('port'), "0.0.0.0", function() { 
    console.log('started'); 
}); 

輸出:

響應=> {名稱:測試}

這裏的想法是。當客戶端調用端點時,是的,URL仍然是/config#,但是您對它進行編碼,使其看起來像/config%23

參見:

http://www.w3schools.com/tags/ref_urlencode.asp

然後,當請求通過到服務器,您在expressJS加層將網址從/config%23解碼爲/config#和更換#燒焦的東西獨特。比如說_bbb,這樣最終的URL是/config_bbb,它被路由到實際的端點。

不幸的是,express不喜歡端點有特殊字符,如果你沒有將#替換成可識別的東西,那麼你會發現它不能正確路由它,即使你的URL匹配。

+0

@ Z。達尼洛希望這會有所幫助。我很滿意這個解決方案沒有得到解決,因爲我只是在這裏拋出一些想法,這對我來說是一種很好的解決方法。 –

+0

@ Sanuel-Toh要查看我的問題的解決方案: [link](http://stackoverflow.com/questions/38447777/when-i-refresh-the-page-not-the-page-loads-angularjs- nodejs) 也非常感謝你的幫助! –

+0

@ Z.Danilo嘿沒有問題。樂於協助,也學習了一些東西。 –

相關問題