【问题标题】:How to handle routes that have # in nodejs with expressjs?如何使用expressjs处理nodejs中具有#的路由?
【发布时间】:2016-07-22 10:42:06
【问题描述】:

问题涉及到:when I refresh the page, not the page loads. Angularjs + Nodejs

但在这种情况下,我禁用了 html5mode,因此符号显示为 #。我想控制访问下面显示的代码的某些部分,但不知道如何处理 #

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

【问题讨论】:

  • 一个 url 哈希 (#xxxxx) 不会被发送到服务器,它只被浏览器使用。与角度无关....哈希是如何工作的
  • 端点名称中包含特殊字符值是不常见的。为了简化事情 - 您应该能够将 layer 添加到 expressJS 中间件中,以将 '#' 转换为某个东西、一个唯一的单词或什么。然后相应地注册您的端点。如果您不介意替代方案,我可以将我的想法作为您的答案。
  • @SamuelToh 请帮帮我。谢谢!

标签: javascript angularjs node.js express


【解决方案1】:

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

首先 - REST URL 中包含特殊字符(如“#”)是非常规的。虽然我认为没有标准的端点命名方式,但建议确保 URL 遵循这些规则;

  1. 全部小写(因为url不区分大小写)
  2. 没有特殊字符
  3. 没有骆驼案

无论如何,我的方法是。

关于服务器代码;

  1. 假设您正在定义路径/config#,然后将“#”字符替换为独特的字符,例如_bbb 够独特吗?你判断,只要确保它不会与其他端点冲突。
  2. 添加一个 express 层来解码 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 中添加的层会将 URL 从 /config%23 解码为 /config#,并将 # 字符替换为独特的字符。假设_bbb,最终的 URL 是/config_bbb,它被路由到实际的端点。

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

【讨论】:

  • @Z。达尼洛希望这会有所帮助。我对解决方案没有得到答复感到满意,因为我只是在这里提出想法,这对我来说是一种 hacky 解决方法。
  • @Sanuel-Toh 要查看我的问题的解决方案:link 也非常感谢您的帮助!!!
  • @Z.Danilo 嘿,没问题。乐于助人,一路上也学到了一些东西。
  • 我在这个 URL en.wikipedia.org/wiki/%3F 上遇到了同样的问题:我想在我的客户端库测试中使用 Express 进行路由。我找不到通过 tel Express 将 %3F(感叹号)路由为路径字符而不是参数分隔符或路由正则表达式特殊字符的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多