我正在尝试扩展request
以劫持和增强其response
和其他“身体”参数。最后,我想为我的 API 添加一些方便的方法:
var myRequest = require('./myRequest');
myRequest.get(function(err, hijackedResponse, rows) {
console.log(hijackedResponse.metadata)
console.log(rows)
console.log(rows.first)
});
根据 Node 文档inherits
,我认为我可以使它工作(并且使用EventEmitter
文档中的示例可以正常工作)。我尝试使用@Trott 的建议让它工作,但意识到对于我的用例它可能不起作用:
// myRequest.js
var inherits = require('util').inherits;
var Request = require("request").Request;
function MyRequest(options) {
Request.call(this, options);
}
inherits(MyRequest, Request);
MyRequest.prototype.pet = function() {
console.log('purr')
}
module.exports = MyRequest;
我也一直在玩弄extend
,希望我能找到一种方法来拦截请求的onRequestResponse
原型方法,但我正在画空白:
var extend = require('extend'),
request = require("request")
function myResponse() {}
extend(myResponse, request)
// maybe some magic happens here?
module.exports = myResponse
结束了:
var extend = require('extend'),
Ok = require('objectkit').Ok
function MyResponse(response) {
var rows = Ok(response.body).getIfExists('rows');
extend(response, {
metadata: extend({}, response.body),
rows: rows
});
response.first = (function() {
return rows[0]
})();
response.last = (function() {
return rows[rows.length - 1] || rows[0]
})();
delete response.metadata.rows
return response;
}
module.exports = MyResponse
请记住,在此示例中,我作弊并将其全部写在.get()
方法中。在我的最终包装模块中,我实际上将method
其作为参数。