В настоящее время я работаю над классом, который я использую в качестве промежуточного программного обеспечения в экспрессе.Прежде чем я войду в класс, имейте в виду, что я буду впрыскивать промежуточное ПО позже, сначала создав экземпляр моего класса «Аутентификатор», а затем внедрив его метод с помощью
app.use(authInst.express)
Таким образом, ключевым моментом будетконтекст выполнения (этой) этой функции.Это код, который я получил до сих пор
Альтернатива 1
class Authenticator {
opts:IAuthOpts ;
express: RequestHandler| ErrorRequestHandler
constructor(opts:IAuthOpts){
this.opts = opts;
this.express = function(req:Request, res:Response, next:NextFunction){
if(this.opts.enabled) {
mainController(req, res, next, this.opts)
} else {
next();
}
}
}
}
Это работает.И все же я не хочу писать функцию в конструкторе, так как нахожу ее довольно уродливым кодом.Помещение экспресс-метода непосредственно в класс, как это
Не работает
class Authenticator {
opts:IAuthOpts;
constructor(opts:IAuthOpts){
this.opts = opts;
}
express(req, res, next){
if(this.opts.enabled) {
mainController(req, res, next, this.opts)
} else {
next();
}
}
}
не будет работать, так как контекст выполнения из Express дастмне это как не определено.Так что осталось использовать этот тип альтернативы
Альтернатива 2
class Authenticator {
opts:IAuthOpts ;
express: RequestHandler| ErrorRequestHandler
constructor(opts:IAuthOpts){
this.opts = opts;
this.express = _express.bind(this);
}
private _express(req, res, next){
if(this.opts.enabled) {
mainController(req, res, next, this.opts)
} else {
next();
}
}
}
Теперь это тоже работает, и я предпочитаю решение этой проблемынасколько это было бы легко перенести метод на другой файл и сохранить мои файлы маленькими.Недостатком является привязка.Я не большой поклонник связывания, так как хочу, чтобы мои функции возвращали одно и то же значение, если я вызываю их с одинаковыми параметрами, независимо от того, откуда они вызываются, и в этом случае вам всегда нужно привязать класс к нему.
Есть ли лучшее решение для аутсорсинга метода из класса TypeScript, и при этом не нужно вводить контекст выполнения с помощью bind?