如何覆盖模块中的函数,即Request.js模块中的Qs.js
How to override a function in the module that is Qs.js in Request.js module?
我需要覆盖位于我帮助的另一个模块中的函数stringifyArray Qs.js。怎样
https://github.com/hapijs/qs
https://github.com/mikeal/request/blob/master/request.js
示例:
var request = require('request');
request.qs.stringifyArray = function (arr, prefix) {
var ret = [];
if (!prefix) throw new TypeError('stringify expects an object');
for (var i = 0; i < arr.length; i++) {
ret.push(this.stringify(arr[i], prefix));
}
return ret.join('&');
};`
My Solution is override(request.request.protype.qs)
var qs = require('qs'),
request = require('request'),
url = require('url');
var stringify;
var toString = Object.prototype.toString;
var isArray = Array.isArray || function (arr) {
return toString.call(arr) === '[object Array]';
};
var objectKeys = Object.keys || function (obj) {
var ret = [];
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
ret.push(key);
}
}
return ret;
};
var stringifyString = function (str, prefix) {
if (!prefix) throw new TypeError('stringify expects an object');
return prefix + '=' + encodeURIComponent(str);
};
var stringifyArray = function (arr, prefix) {
var ret = [];
if (!prefix) throw new TypeError('stringify expects an object');
for (var i = 0; i < arr.length; i++) {
ret.push(stringify(arr[i], prefix));
}
return ret.join('&');
};
function stringifyObject(obj, prefix) {
var ret = [];
var keys = objectKeys(obj);
var key;
for (var i = 0, len = keys.length; i < len; ++i) {
key = keys[i];
if ('' === key) {
continue;
}
if (null === obj[key]) {
ret.push(encodeURIComponent(key) + '=');
} else {
ret.push(stringify(obj[key], prefix ? prefix + '[' + encodeURIComponent(key) + ']' : encodeURIComponent(key)));
}
}
return ret.join('&');
}
stringify = function (obj, prefix) {
if (isArray(obj)) {
return stringifyArray(obj, prefix);
} else if ('[object Object]' === toString.call(obj)) {
return stringifyObject(obj, prefix);
} else if ('string' === typeof obj) {
return stringifyString(obj, prefix);
} else {
return prefix + '=' + encodeURIComponent(String(obj));
}
};
并覆盖原型。qs:
request.Request.prototype.qs = function (q, clobber) {
var base;
if (!clobber && this.uri.query) {
base = qs.parse(this.uri.query)
}
else {
base = {}
}
for (var i in q) {
base[i] = q[i]
}
if (stringify(base) === '') {
return this
}
this.uri = url.parse(this.uri.href.split('?')[0] + '?' + stringify(base));
this.url = this.uri;
this.path = this.uri.path;
return this;
};
相关文章:
- 正在更改node.js模块变量
- react native中常见的js模块
- grunt serve:dist时找不到Angular.js模块,但grunt serve工作正常
- 如何为JS模块添加包含路径
- 在混合基本 URL 下动态加载 require.js 模块
- 如何在公共js模块中从web服务返回数据
- 找不到以前导入的 JS 模块
- 从 Node.js 模块中的缓冲区实例中逐行读取字符串
- 定义 Backbone.Layout 作为 need js 模块
- 在节点中.js“模块”始终是一个对象
- Node.js模块的异步初始化
- 不要自动嘲笑常见的js模块
- Node.js模块问题
- Node.JS-Q模块-承诺
- Node.js-模块导出静态变量
- 正在从node.js模块获取D9025警告和C1083错误..I'I’我没有主意
- 从node.js模块中向JSON添加原型函数
- 是否可以创建一个require.js模块,该模块在加载完成后自行决定
- 检查node.js模块是否可用
- 将JavaScript代码迁移到具有String.prototype扩展名的node.js模块