2016-07-20 38 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嘿没有问题。乐于协助,也学习了一些东西。 –

相关问题