扩展nodejs请求对象

san*_*ius 2 node.js

如何扩展node.js请求对象并向其添加自定义方法和属性?我需要能够this从节点的请求访问,因为我需要url等.

c.P*_*.u1 6

传递给http.createServer回调的请求对象是一个http.IncomingMessage对象.要扩充请求对象,可以添加方法http.IncomingMessage.prototype.

var http = require('http');

http.IncomingMessage.prototype.userAgent = function () {
  return this.headers['user-agent'];
}
Run Code Online (Sandbox Code Playgroud)

要添加访问者属性:

Object.defineProperty(http.IncomingMessage.prototype, 'userAgent', {
  get: function () {
    return this.headers['user-agent'];
  }
}
Run Code Online (Sandbox Code Playgroud)

如果现有对象在构造函数体中定义了其方法,则可以使用委托:

function AugmentedRequest() { 
  this.userAgent = function () {}
}

AugmentedRequest.call(request); //request now has a userAgent method
Run Code Online (Sandbox Code Playgroud)

另一种不涉及增加request对象的方法是使用组合.

var extendedRequest = {
  get userAgent() {
    this.request.headers['user-agent'];
  }
}

createServerCallback(function (req, res) {
  var request = Object.create(extendedRequest);
  request.request = req;
});
Run Code Online (Sandbox Code Playgroud)

这种技术在koa中被大量用于包装Node对象.