Nodejs: метод класса экспресс-вызова возвращает неопределенное значение `this`

Это мой код:

баннерКонтроллер:

class bannerController extends generalController {
  constructor() {
    super(BannerService);
  }
}

export default new bannerController();

общийКонтроллер:

export default class generalController {
  public service: any;

  constructor(service: any) {
    this.service = service;
  }

  public async status(req: Request, _res: Response, next: NextFunction): Promise<void> 
  {
    console.info(this)
  }
}

маршрутизатор:

router.patch(
  '/banner/:id/status',
  bannerController.status,
);

Эта строка console.info(this) возвращается undefined

Если я изменю его на bannerController.status.bind(bannerController), все будет хорошо.

Но я не хочу использовать call, bind и...

если вы хотите правильный this - тогда вы должны использовать call, bind или apply.

Daniel A. White 14.04.2023 16:18

есть декораторы машинописных текстов и другие пакеты, которые также помогают в этом, но они используют call, bind и applynpmjs.com/package/auto-bind

Daniel A. White 14.04.2023 16:19

Не забудьте назвать свои классы, начинающиеся с заглавных букв. Это не имеет прямого отношения к вашей проблеме, но это было бы правильной практикой.

Nikita 14.04.2023 16:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
74
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Альтернативным подходом было бы предоставление вашему классу метода, который возвращает функцию промежуточного программного обеспечения, как показано в следующем коде (Javascript, а не Typescript, извините):

class generalController {
  ...
  statusMiddleware() {
    return async function(req, _res, next) {
      console.info(this);
    }.bind(this);
  }
}
router.patch(
  '/banner/:id/status',
  bannerController.statusMiddleware()
);

bind заставляет меня повторять bannerController

MHHH 14.04.2023 16:35

Итак, вы не возражаете против использования .bind(this), как в моем отредактированном ответе?

Heiko Theißen 14.04.2023 16:36

Другие вопросы по теме