如何在 require 中使用原型?

How to use prototype with require?

我想在 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 框架。

But I'm getting has no method 'middleware' error

那是因为您的 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)
];