如何使用需要的原型?

时间:2015-02-01 17:26:49

标签: javascript node.js restify

我有以下代码要在Node模块中导入:

Kc.prototype.middleware = function(options) {

  options.logout = options.logout || '/logout';
  options.admin  = options.admin  || '/';

  var middlewares = [];

  middlewares.push( Setup );
  middlewares.push( PostAuth(this) );
  middlewares.push( AdminLogout(this, options.admin) );
  middlewares.push( GrantAttacher(this) );
  middlewares.push( Logout(this, options.logout) );

  return middlewares;
};

我在main.js中要求这个:

var kc = require('connect-kc');

server.use(kc.middleware());

但我收到has no method 'middleware'错误

如何在main.js中要求和使用中间件?

我正在使用Restify框架。

1 个答案:

答案 0 :(得分:1)

  

但我收到has no method 'middleware'错误

这是因为您的Kc对象没有middleware属性。它的prototype属性为middleware

如果Kc是一个函数,你可能想要这样使用它:

var Kc = require('connect-kc');

var kc = new Kc();
server.use(kc.middleware());

如果Kc 不是某个功能,那么:

var Kc = require('connect-kc');

server.use(Kc.prototype.middleware());

...但我会强烈建议您不要给它一个名为prototype的属性,因为这非常具有误导性。函数实例上的prototype属性引用由new TheFunctionName创建实例时该函数将分配给实例的对象。


旁注1:

此代码可疑:

options.logout = options.logout || '/logout';
options.admin  = options.admin  || '/';

通常不一定要伸出手来更改来电者的对象。相反,通常在实例之间创建一个复制属性的函数(它通常称为extend),然后是:

,这很有用。
var opts = extend({}, defaults, options);

...其中defaults有默认的logoutadmin选项。然后使用opts而不是optionsextend函数看起来像这样:

function extend(target) {
    Array.prototype.slice.call(arguments, 1).forEach(function(arg) {
        Object.keys(arg).forEach(function(key) {
            target[key] = arg[key];
        });
    });
    return target;
}

旁注2:

如果您愿意,可以更清晰地创建middlewares数组并且(主观地)

var middlewares = [
  Setup,
  PostAuth(this),
  AdminLogout(this, options.admin),
  GrantAttacher(this),
  Logout(this, options.logout)
];