在单个模块中重写node.js querystring.escape

我想在一个对象上使用querystring.stringify。 string的要求稍微不符合标准,星号,斜线和撇号都需要转义。 Querystring不会逃避这些(他们通常不需要),但文档说,querystring.escape是专门公开的,以便我们可以用我们自己的函数覆盖它。 以下将为我工作:

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

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

很明显,我可以写一个封装器,在传统的调用querystring.stringify之后进行replace,但是我很好奇,因为对于我来说,标准节点模块真的有一个“全局”设置是很奇怪的,除非实际上有一些方法毕竟需要一个独特的实例。

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

不是真的。 节点的模块caching是每个进程并基于模块的文件path 。

更改不会跨越/从子stream程或集群 。 所以,你可以通过其中的一个将你的脚本与自己的querystring隔离开来。

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


这可能会改变将来可能还需要查询string的其他模块的行为(使用正常的转义函数)。

那么,如果一个URL编码的值有其他字符编码的话,它仍然是有效的。 通常他们不需要这样做。

而且,我想,可能会影响对编码值产生期望的模块。 但是,这通常是一个奇怪的select(例外是你自己的querystring.escapeunit testing)。 所以,只要能够正确解码,应该没问题。

 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.escapequerystring.unescape的能力是devise的:

querystring.stringify使用的转义函数, 以便可以在必要时重写