我有以下代码要在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框架。
答案 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
有默认的logout
和admin
选项。然后使用opts
而不是options
。 extend
函数看起来像这样:
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)
];