如何处理在带有expressjs的nodejs中的#的路由?

时间:2016-07-20 23:36:16

标签: javascript angularjs node.js express

问题与:when I refresh the page, not the page loads. Angularjs + 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();    
    });

1 个答案:

答案 0 :(得分:0)

我不愿意发布这个,因为我认为这不是OP问题的真正解决方案。对我来说这是一个黑客,所以使用它需要你自己承担风险。

首先,REST URL的特殊字符如#'#'在他们中。虽然我认为没有标准方法来命名端点,但建议确保URL遵循这些规则;

  1. 所有小写字母(因为网址不区分大小写)
  2. 没有特殊字符
  3. 没有骆驼案
  4. 无论如何,我的方法是。

    在服务器代码上;

    1. 假设您要定义路径/config#,请替换'#' char有一些独特的东西_bbb足够独特?你判断,只要确保它不会与其他终端发生冲突。
    2. 添加快速图层以解码网址的特殊字符,并将特殊字符替换为您在第1点中给出的唯一字词。(当您看到代码时,这将更加清晰。)
    3. 客户代码:

      1. 对网址进行编码。为什么?因为网址不能包含'#'因为它是保留字符。所以它必须被编码为'%23'代替。
      2. 示例:

        <强>客户端:

        "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');
        });
        

        <强>输出:

          

        response =&gt; {name:test}

        这里的想法是。当客户端调用端点时,是的,URL仍然在/config#,但您对其进行编码,使其看起来像/config%23

        查看:

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

        然后,当请求进入服务器时,您在expressJS中添加的图层将解码从/config%23/config#的网址,并将#字符替换为唯一的字符。我们说_bbb,以便最终的网址为/config_bbb,并将其路由到实际的端点。

        不幸的是,表达并不喜欢端点中包含特殊字符,如果您不将#替换为可识别的字符,那么您会发现它不会被路由即使URL匹配,它也是正确的。