7

我想在一个对象上使用 querystring.stringify。对字符串的要求有点不合标准,星号、斜线和撇号都需要转义。Querystring 不会转义这些(它们通常不需要),但文档说 querystring.escape 是专门公开的,因此我们可以用我们自己的函数覆盖它。以下内容对我有用:

querystring.escape = function(str) {
    str = encodeURIComponent(str)
        .replace(/\*/g, '%2A')
        .replace(/\(/g, '%28')
        .replace(/\)/g, '%29')
        .replace(/'/g, '%27');
    return str;
};

我唯一担心的是,如果我理解正确,这可能会改变其他模块的行为,这些模块将来也可能需要查询字符串(具有正常的转义函数)。node.js 文档说模块只加载一次,原始实例返回给后续的 require 调用。有没有办法让我强制这个特定的查询字符串实例是唯一的?

显然,我可以编写一个包装器,在对 querystring.stringify 的常规调用之后进行替换,但我很好奇,因为在我看来,标准节点模块确实具有“全局”设置似乎很奇怪,除非实际上有某种方式毕竟需要一个唯一的实例。

4

1 回答 1

6

有没有办法让我强制这个特定的查询字符串实例是唯一的?

并不真地。Node 的模块缓存是按进程进行的,并且基于模块的文件路径

更改不会跨入/跨出 Child ProcessesClusters。因此,您可以querystring通过其中之一将您的脚本与其自己的脚本隔离开来。

但是,在同一个过程中,Node 并没有提供官方方法来绕过这个来为单个模块检索唯一实例。


这可能会改变将来可能还需要查询字符串(具有正常转义函数)的其他模块的行为。

好吧,如果 URL 编码的值有额外的字符编码,它仍然有效。只是通常他们不需要。

而且,我想,可能会影响对编码值寄予期望的模块。但是,这通常是一个奇怪的选择(您自己的单元测试除外querystring.escape)。所以,只要能正确解码,应该没问题。

querystring.escape = function (str) { /* ... */ }; // your function here

var sample = "a(b*c)'d";

var encoded = querystring.escape(sample);
console.log(encoded);             // a%28b%2ac%29'd

var decoded = querystring.unescape(encoded);
console.log(decoded);             // a(b*c)'d
console.log(decoded === sample);  // true

querystring.escape并且,覆盖和的能力querystring.unescape是设计使然:

提供的转义函数querystring.stringify,以便在必要时可以覆盖它

于 2013-08-01T01:51:36.220 回答